動画の動体検知の出力値を画面上に表示するプログラムを作成しました。
OpenCVの関数を使うと短いコードで実現出来ます。
ソースコード
import cv2 # 動画読み込みの設定 movie = cv2.VideoCapture('motion_test.mp4') # 動画ファイル保存用の設定 fps = int(movie.get(cv2.CAP_PROP_FPS)) # 動画のFPSを取得 w = int(movie.get(cv2.CAP_PROP_FRAME_WIDTH)) # 動画の横幅を取得 h = int(movie.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 動画の縦幅を取得 fourcc = cv2.VideoWriter_fourcc('H','2','6','4') # 動画保存時のfourcc設定 video = cv2.VideoWriter('motion_out.avi', fourcc, fps, (w, h),False) # 動画の仕様(ファイル名、fourcc, FPS, サイズ) print('fps:%d w:%d h:%d' %(fps,w,h)) # 背景差分の設定 fgbg = cv2.bgsegm.createBackgroundSubtractorMOG() # 背景オブジェクト # ファイルからフレームを1枚ずつ取得して動画処理後に保存する while True: ret, frame = movie.read() # フレーム取得 fgmask = fgbg.apply(frame) # 前景領域のマスクを取得 moment = cv2.countNonZero(fgmask) # 動体検知した画素数を取得 text = 'Motion:' + str(moment) font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(frame,text,(20,100),font,2,(0,255,0),2,cv2.LINE_AA) #フレームに表示 cv2.imshow('frame',frame) cv2.waitKey(1) # フレームが取得できない場合はループを抜ける if not ret: break # 撮影用オブジェクトとウィンドウの解放 movie.release()
4行目:プログラムと同じディレクトリに置いた「motion_test.mp4」と名付けたファイルを読み込みます。
10行目:出力コーデックにH264を指定します。
11行目:mp4形式だとエラーになってしまったためavi形式を指定。引数の最後にFalseも必要のようです。
16行目:cv2.bgsegm.createBackgroundSubtractorMOGという混合正規分布を基にした前傾・背景分割アルゴリズムを用いた関数を使用しました。
22行目:上記のアルゴリズムを読み込んだフレームに適用します。
動体値が0だと黒となり、動体値が0より大きいと白となります。
23行目:白になった画素数をカウントします。
26行目:OpenCVのputText関数を使ってカウント値をフレームに表示します。
結果動画
(1)入力動画(motion_test.mp4)
(2)動体のみを出力した動画
(3)入力動画に動体検知の出力値を付加した動画
参考
Python/OpenCVで動体検知!動画の動いている部分を検出