OpenCVを使って動画に映る人を検出

OpenCV
スポンサーリンク

今回は前回に引き続き、OpenCVを使用して動画に現れる人を検出していきましょう。

利用する手法は、フレーム間差分法を使用していきます。

 

1.環境・使用材料

言語:python

ライブラリ:OpenCV

エディタ:spyder

使用した素材:

素材元:https://github.com/opencv/opencv/blob/master/samples/data/vtest.avi

2.ソースコード

 

3.ソースコード詳細

まずはライブラリのインポートをしましょう。

使用するライブラリはopencvライブラリとnumpyをインポートしてください。

 

次に、フレーム間差分の一連の流れをframe_finという関数を定義していきます。

今回定義する関数は、以下の処理を実行する関数として定義していきます。

①取得したフレームの絶対値化差分を計算
②論理積画像の算出
③二値化
④ゴマ塩ノイズ除去

 

frame_fin(img1, img2, img3, th)について説明します。

img1: 取得したフレームの1枚目

img2: 取得したフレームの2枚目

img3: 取得したフレームの3枚目

th    : 二値化に必要な閾値の設定

 

まず動画を読み込むため、cv2.VideoCapture()関数を使用します。使い方は以下の通りです。

cv2.VideoCapture(r’動画を保存されている相対パス/絶対パス’)

 

次に、算出した結果(動画)を記録するための保存用のvideo readerを作成します。

まず動画キャプチャの幅・高さ・動画のフレームレートを定義していきます。それぞれ読み込んだ動画と同じ条件としていきます。

取得する方法は、cap.get()関数で取得します。

動画キャプチャの幅:width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

動画キャプチャの高さ: height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

動画のフレームレート:fps = cap.get(cv2.CAP_PROP_FPS)

 

そして条件を設定したら動画の書き込み設定を行います。

動画の書き込みは、cv2.VideoWriter()関数を使用します。使い方は以下の通りです。

cv2.VideoWriter(第1引数:保存する動画名(例: output.avi),第2引数-第4引数:FourCC コード)

cv2.VideoWriter_fourcc(*’DIVX’)

FourCCコードとは動画のコーデックを指定するための4バイトのコードです。

今回はFourCCコードをDIVXを使用するため、fourccコードを定義する関数  cv2.VideoWriter_fourcc(*’DIVX’)として定義しました。

参照HP:動画を扱うFourCC.org

 

次にwhile文を使用して、qキーが押されるまで繰り返し処理するとします。

while文の使い方
while 条件式:
条件式が真(true)の時に実行する処理1
条件式が真(true)の時に実行する処理2

次にcap.read()関数で、今回使用する動画の読み込みを行います。

cap.read()読み込んだ結果は以下の通りです。

cap.read()[0]: bool型の結果が返されます。True/Falseのどちらかです。

cap.read()[1]: 読み込んだ動画(RGB動画で返されます)

 

cv2.cvtColor()関数を使用して、読み込んだ動画からフレームを1枚指定しグレースケールに変換します。

cv2.cvtColor()関数の使い方は以下の通りです。

cv2.cvtColor(input_image, flag)
input_image : 入力画像
flag : 色変換の種類(今回はcv2.COLOR_RGB2GRAYを使用しグレースケール画像に変換)

 

frame_fin関数は、先ほど定義した関数になります。

今回はグレースケールを変換したフレーム3枚を入力画像とし、閾値を10としました。

 

完成した動画

今回の検出結果は以下のようになりました。

良かったら参考にしてください。

 

参考サイト

【Python/OpenCV】フレーム間差分法で移動物体の検出
Python版OpenCVでフレーム間差分法を実装し、移動物体を検出する方法をソースコード付きで解説します。

コメント

タイトルとURLをコピーしました