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

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

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

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

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

目次

・もと動画

・動画に写る人の中から3人を検出

・補足

・本当に大きい順で並び替えているのか確認

・青 => 緑=> 赤の順番に写ったときの様子


もと動画


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

動画に写る人の中から3人を検出

Pythonで動画に写る人を検出する方法で投稿したプログラムから変更したところが10行目から46行目なので、その部分のプログラムを説明します。

10行目から46行目のプログラムを説明をします。

10行目は検出した人の座標が入っている変数imagesをnumpy配列からリストに変換しています。ここで変換をしないと下のプログラムで正しく並び替えできないです。

13行目から18行目は高さ(images[j][3])の値を元に、座標を大きい順(降順)に並び替えています。

20行目はリストに変換した座標データをnumpy配列に戻します。

22行目から25行目は検出した人の座標が3個以上あるか確認し、3個以上あれば四角で囲む座標を入れるためのリスト(data_3)をglobalで使えるようにしています。そして、data_3.append(images[0])の命令で高さの値が1番高い座標をリストに追加しています。
※13行目から18行目で大きい順(降順)に並び替えたので、images[0]の0番目は1番大きい値になります。

28行目から31行目は高さの値が1番目の値じゃないとき、2番目の座標をリスト(data_3)に追加しています。ここで気をつけないといけないことが2番目に大きい値があればbreakをしてfor文を終了させないといけないことです。breakをしないと次の繰り返しで2番目の値と同じ値がある場合、3番目にも2番目と同じ値が入ってしまいます。

34行目から37行目は検出した座標の数for文で繰り返して、1番目の値でも2番目の値でもない場合3番目の座標をリスト(data_3)に追加しています。追加し終わればbreakで終了します。

38行目から46行目は四角で囲む色を決めています1番目に大きい値は青色2番目に大きい値は緑色3番目に大きい値は赤色にしています。

補足

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 高さ

本当に大きい順で並び替えているのか確認

8行目にprint(“全体\n”,images)と20行目にprint(“並び替え\n”,images)、46行目と47行目にfor i in range(len(data_3)):とprint(str(i+1)+”番目”+str(data_3[i]))を追加して表示します。
その様子がこちら↓になります。

実行結果を見てわかるように、高さの値で大きい順に並び替えができています。

青 => 緑=> 赤の順番に写ったときの様子

感想
足とか人じゃない所を四角で囲んでしまうので、まだ改良が必要だなと思いました。

3人の検出以外に動画に写る人の中から1人だけ検出する方法をこちら↓の投稿で紹介しています。
Python 動画に写る人を1人だけ検出する方法