Python3 OpenCV3によるオプティカルフローによる物体検出
Python3 OpenCV3で画像の特徴点を抽出 に関連。
[amazonjs asin="4839952965″ locale="JP" title="OpenCV 3 プログラミングブック"]
前提
[shell title="pipでインストールしたモジュール一覧"]
gnureadline==6.3.3
ipython==3.1.0
matplotlib==1.4.3
nose==1.3.7
numpy==1.9.2
Pillow==2.9.0
pyparsing==2.0.3
python-dateutil==2.4.2
pytz==2015.4
scipy==0.16.0
six==1.9.0
sympy==0.7.6
[/shell]
requirements.txtに上記の一覧を記述して、
[shell]
$ pip install -r requirements.txt
[/shell]
とすればOpenCV以外の同じ環境が構築できる。
オプティカルフローとは
オプティカルフローとは、「視覚表現(通常、時間的に連続するデジタル画像)の中で物体の動きをベクトル」とのこと。
連続するフレームの差分から算出して表示する。
手順は以下のとおり
1 フレーム画像(pre)を取得する。
2 フレーム画像をグレースケール変換する。
3 フレーム画像をHSV変換する。
—-ここからループ—-
4 カメラをキャプチャする。
5 フレーム画像(next)を取得する。
6 グレースケール変換する。
8 preとnextのグレースケール画像からオプティカルフローを計算する。
9 フローの角度と大きさを計算する。
10 計算した角度から色を決定する。
11 結果を表示する。
—-ここまでループ—-
オプティカルフローをしてみる
sourceディレクトリにoptical_flow.pyを作成する。
[python title="optical_flow.py"]
# -*- coding: utf-8 -*-
import cv2
import numpy as np
if __name__ == '__main__’:
cap = cv2.VideoCapture(0)
ret, flame = cap.read()
# グレースケール変換
img_gray_current = cv2.cvtColor(flame, cv2.COLOR_BGR2GRAY)
# HSV変換
img_hsv = cv2.cvtColor(flame, cv2.COLOR_BGR2HSV)
while(True):
ret, flame = cap.read()
img_gray_next = cv2.cvtColor(flame, cv2.COLOR_BGR2GRAY)
flow = cv2.calcOpticalFlowFarneback(img_gray_current,
img_gray_next,
None,
0.5,
3,
15,
3,
5,
1.2,
0)
img_gray_current = img_gray_next
magnitude, angle = cv2.cartToPolar(flow[…,0],
flow[…,1])
img_hsv[…,0] = angle * 180 / np.pi / 2
img_hsv[…,2] = cv2.normalize(magnitude,
None,
0,
255,
cv2.NORM_MINMAX)
img_bgr = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
cv2.imshow("test", img_bgr)
# qを押したら終了。
k = cv2.waitKey(1)
if k == ord('q’):
break
cap.release()
cv2.destroyAllWindows()
[/python]
実行してみる。
[shell]
(opencv_python) $ python optical_flow.py
[/shell]
ちなみにスタバで撮影した。
ディスカッション
コメント一覧
cv2.calcOpticalFlowFarnebackの3つめNoneは何を意味しているのですか?
cv2.calcOpticalFlowFarnebackの返り値と同じ値が出力されます。おそらく、C++だとcv2.calcOpticalFlowFarnebackはvoidの関数のため、3番目の引数であるflowで値を取得しますが、
Pythonの場合はflowが返り値のため、必要のない仮引数だと思います。