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()
>どうやって最も大きい面積のxywhの値を抜き出せますか?
算数的な発想ですが、xywhの面積を検出して一番大きいのだけにcv2.rectangleをすればいいと思いますが
それでいいでしょうか?
インデントがわからないのでコードを
```
コード
```
の様に```で挟んでください。
面積の求め方、最大値の求め方がわからないって質問なのでしょうか。
失礼しました。コード修正しました。
面積はw*hを使えば求めれるのですが、顔が二つ三つ検出された場合に面積を比較し、最も大きい面積のxywhのみを抜き出してcv2.rectangleをする方法がわかりません。
言葉足らずですいません。
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 )
とかでどうでしょう?
ありがとうございますー
あ、tiitoiさんのコードでOKだったんですね。特にコメントついてなかったのでコードが理解できなくて
動かせないとか理由があるのかな?と思って追記しましてしまいましたが。。なんにせよ解決して良かったですね!
すいません。初めてこのサイト使うので、回答が別でついていることに気づいてなかったです!!
ありがとうございました!
回答1件
あなたの回答
tips
プレビュー