Python 動画に写る人を1人だけ検出する方法
PythonのOpenCVを使って動画に写る人を1人だけ検出する方法とプログラムの説明を投稿します
動画の読み込みと表示はこちらの投稿で「Python OpenCVを使った動画の読み込みと表示」紹介しているので、この投稿では1人だけ検出するプログラムをメインに紹介します。
人を検出するときに使うhaarcascadeファイルのダウンロード方法はこちら「OpenCVを使った顔と目の検出方法 Python」の投稿で紹介しています。
読み込んで表示した動画は「Pexels」の動画を使わさせてもらいました。
目次
・もと動画
・動画に写る人を1人だけ検出した様子
・動画に写る人を1人だけ検出するプログラム
・補足
・本当に1番大きい高さを選択しているのか確認
もと動画
人を検出するのに使うもと動画になります。
動画に写る人を1人だけ検出した様子
動画に写る人を1人だけ検出するプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import cv2 cascade=cv2.CascadeClassifier("haarcascade_fullbody.xml") def detectface(src):#人を検出する自作関数 src_gray=cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)#グレイ画像 images = cascade.detectMultiScale(src_gray)#人の検出 #1人だけ検出 data_1=[0,0,0,0] hh=0 for i in range(len(images)):#検出した人の数、繰り返す if images[i][3] > hh:#images[i][3]は高さ hh=images[i][3] data_1=images[i]#検出して一番大きい高さの座標を入れる x,y,w,h=data_1#座標をxywhに入れる cv2.rectangle(src, (x, y), (x+w, y+h), (0,0,255), 3)#四角で囲む mv= cv2.VideoCapture('pexels-george-morina-5962271.mp4')#動画の読み込み frame_count =int(mv.get(cv2.CAP_PROP_FRAME_COUNT))#動画を画像にした総枚数を調べる for i in range(frame_count):#総枚数 ch,frame=mv.read()#1フレーム(画像)取り出す if ch==True:#取り出せたかどうかの確認 size=(640,480) frame=cv2.resize(frame,size) detectface(frame)#自作関数の呼び出し cv2.imshow('movie', frame)#表示 k=cv2.waitKey(1)#1ミリ秒wait if k==27:#ESCキーを押したとき break mv.release() cv2.destroyAllWindows() |
「Pythonで動画に写る人を検出する方法」で投稿した”動画に写る人を検出するプログラム“から変更したところが10行目から18行目だけなので、その部分のプログラムを説明します。
10行目は検出した1人だけの座標x,y,w,hを入れるためのリストdata_1を用意しています。
12行目から15行目は1フレーム(画像)の中から検出した人の数、for文で繰り返しています。
そして、繰り返すなかで検出した人の高さにあたる値(images[i][3])と0を入れて初期化した変数hhをif文で比較して、
images[i][3]が大きい場合は変数hhにその大きい値を入れ、1フレーム(画像)の中で高さが1番大きい座標を見つけるまで比較を繰り返します。
17、18行目は高さが1番大きい座標をx、y、w、hに入れて、cv2.rectangleでその座標をもとに赤い四角の枠で囲みます。
補足
x,y,w,hそれぞれの意味について、xとyは検出した人の位置を表す座標になります。xは横軸、yは縦軸の意味です。そして、wとhは検出した人の大きさを表します。wは幅、hは高さの意味です。
images[i][0]=x 横軸
images[i][1]=y 縦軸
images[i][2]=w 幅
images[i][3]=h 高さ
本当に1番大きい高さを選択しているのか確認
8行目にprint(“全体”,images)を追加し、19行目にprint(“一番高い”,data_1)を追加して、変数data_1に高さが1番大きい座標が入っているのか確認します。
その様子がこちら↓になります。

実行結果を見てわかるように、images[i][3]の高さが1番大きい座標をdata_1に入れています。
1人だけの検出以外に動画に写る人の中から3人を検出する方法をこちら↓の投稿で紹介しています。
「Python 動画に写る人の中から3人を検出する方法」