質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

742閲覧

顔認識した対象を絞るやり方

tanaka996

総合スコア1

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/29 02:31

編集2020/10/29 04:48

pythonとopenccvを使って顔認識をし、認識した顔の中で最も大きい面積の顔にのみ四角の枠で囲むシステムを作りたいです。
webカメラを使ったリアルタイムのシステムです。
現在は複数の顔がある場合はすべてに四角く枠が付く状態です。

どうやって最も大きい面積のxywhの値を抜き出せますか?

独学で最近勉強し始めたのでコードが汚かったり醜いなどあると思いますが、よろしくお願いします。

該当のソースコード

「Python」

import cv2 cap = cv2.VideoCapture(0) cascade_file = 'C:/Users/username/Anaconda3/Lib/site-packages\cv2\data\haarcascade_frontalface_default.xml' cascade = cv2.CascadeClassifier(cascade_file) while cap.isOpened(): ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) face = cascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=2, minSize=(100, 100) ) if len(face) == 0: pass else : for x, y, w, h in face: color = ( 0, 0, 110 ) cv2.rectangle( frame, (x, y), (x+w, y+h), color, 2 ) cv2.imshow( 'frame1', frame ) key = cv2.waitKey(1) if key == ord('q'): break cv2.destroyAllWindows() cap.release()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yasutakatou

2020/10/29 02:43

>どうやって最も大きい面積のxywhの値を抜き出せますか? 算数的な発想ですが、xywhの面積を検出して一番大きいのだけにcv2.rectangleをすればいいと思いますが それでいいでしょうか?
1T2R3M4

2020/10/29 02:47 編集

インデントがわからないのでコードを ``` コード ``` の様に```で挟んでください。 面積の求め方、最大値の求め方がわからないって質問なのでしょうか。
tanaka996

2020/10/29 05:21 編集

失礼しました。コード修正しました。 面積はw*hを使えば求めれるのですが、顔が二つ三つ検出された場合に面積を比較し、最も大きい面積のxywhのみを抜き出してcv2.rectangleをする方法がわかりません。 言葉足らずですいません。
yasutakatou

2020/10/29 10:52

for x, y, w, h in face:で検出した数だけ回しているので forの前に面積の最大値を格納するmaxX maxY maxW maxHなどを作って、 if文で一番大きい値だけ残します。最後にforを抜けたところでcv2.rectangleをするのはどうでしょうか? maxX = 0 maxY = 0 maxW = 0 maxH = 0 menseki = 0 for x, y, w, h in face:  if menseki < (x + h )* (y + w):   maxX = x   maxY = y   maxH = h   maxW = w   menseki = (x + h )* (y + w) cv2.rectangle( frame, (maxX, maxY), (maxX+maxW, maxY+maxH), color, 2 ) とかでどうでしょう?
tanaka996

2020/10/31 03:35

ありがとうございますー
yasutakatou

2020/10/31 05:03

あ、tiitoiさんのコードでOKだったんですね。特にコメントついてなかったのでコードが理解できなくて 動かせないとか理由があるのかな?と思って追記しましてしまいましたが。。なんにせよ解決して良かったですね!
tanaka996

2020/11/04 07:01

すいません。初めてこのサイト使うので、回答が別でついていることに気づいてなかったです!! ありがとうございました!
guest

回答1

0

ベストアンサー

detectMultiScale() の各要素は (x, y, w, h) なので、

python

1max_face = max(faces, key=lambda x: x[2] * x[3])

とすれば、面積 w * h が最大の要素が取得できます。

python

1# 検出する。 2faces = face_cascade.detectMultiScale(gray) 3 4if len(faces) > 0: 5 max_face = max(faces, key=lambda x: x[2] * x[3]) 6 7 # 矩形を画像に描画する。 8 x, y, w, h = max_face 9 cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2)

投稿2020/10/29 03:42

編集2020/10/29 03:43
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanaka996

2020/11/04 07:02

回答ありがとうございます。試したらできました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問