Pythonで動画に写る人を検出する方法

PythonのOpenCVを使って動画に写る人を検出する方法とプログラムの説明を投稿します。

動画の読み込みと表示はこちらの投稿でPython OpenCVを使った動画の読み込みと表示紹介しているので、この投稿では人を検出するプログラムをメインに紹介します。

人を検出するときに使うhaarcascadeファイルのダウンロード方法はこちらOpenCVを使った顔と目の検出方法 Pythonの投稿で紹介しています。

読み込んで表示した動画はPexelsの動画を使わさせてもらいました。

目次

・もと動画

・人を検出して四角で囲んだ動画

・動画に写る人を検出するプログラム

・人を検出した座標データの様子

・実行結果の感想と対策


もと動画

人を検出するのに使うもと動画になります。


人を検出して四角で囲んだ動画

動画に写る人を検出するプログラム

動画に写る人を検出するプログラムの説明をします。

まず、3行目で人を検出するための“haarcascade_fullbody.xml”ファイルをcv2.CascadeClassifierを使って読み込みます。

それから、def文を飛ばした12、13行目はcv2.VideoCaptureで人を検出する動画を読み込み、int(mv.get(cv2.CAP_PROP_FRAME_COUNT))で読み込んだ動画1枚、1枚の画像にしたきの総枚数を調べています。そして、調べた総枚数を変数frame_countに入れています。このときにint型にしないとエラーがでます。

15行目から21行目は動画から画像にした総枚数をfor文で繰り返していき、mv.read()1画像(1フレーム)ずつ取り出して、17行目のif文で本当に取り出せたか確認しています
確認ができればcv2.resizeを使って表示する大きさを調整しています。そして、20行目の人を検出する自作関数detectface(frame)に取り出した画像データをに渡します。21行目は自作関数detectfaceで人を検出し、赤い四角で囲んだ画像をcv2.imshowで表示します。

5行目から10行目の人を検出する自作関数detectfaceについて、まず、7行目の人を検出するプログラムcascade.detectMultiScale(src_gray)で使うために、6行目のcv2.cvtColorで画像をグレイ画像にしています。そして、人を検出することができれば、変数imagesに検出した人が写る場所の座標データが入り、9行目のfor文にその座標データを渡して、人を検出した数for文を繰り返します。次に、座標データを元に10行目のcv2.rectangleで検出した人を赤い四角の枠で囲みます。

※人と顔、目などを検出するときはグレイにした画像を使います。グレイ画像にして、色を少なくすることで処理を行いやすくしています。

23行目から25行目はcv2.waitKey(1)で取り出した画像を1ミリ秒表示するようにして、if k==27:とbreakでキーボードのESCキーを押したら動画の表示をしないようにしています。

最後の27、28行目は動画の表示が終われば、表示を終了してウインドウ(表示画面)を閉じるようにしています。

人を検出した座標データの様子

人を検出した座標のデータが入っている変数imagesの中身はこんな感じになります。

このデータをfor x,y,w,h in images:で取り出していきます。
x,y,w,hそれぞれの意味について、xとyは検出した人の位置を表す座標になります。xは横軸yは縦軸の意味です。そして、wとhは検出した人の大きさを表します。wは幅hは高さの意味です。

このx,y,w,hをfor文で取り出した様子が↓こちらです。

x,y,w,hの座標をもとにcv2.rectangle(src, (x, y), (x+w, y+h), (0,0,255), 3)で人を赤い四角の枠で囲みます。
※10行目のsrcは画像データが入っている変数です。

実行結果の感想と対策

この検出方法だと人を検出した箇所全部を囲むのでごちゃごちゃします。

そのごちゃごちゃを解決した方法が↓こちらになります

Python 動画に写る人を1人だけ検出する方法

Python 動画に写る人の中から3人を検出する方法