Python3 OpenCV3によるオプティカルフローによる物体検出

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

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]

ちなみにスタバで撮影した。

Related posts

2 Thoughts to “Python3 OpenCV3によるオプティカルフローによる物体検出”

  1. 山本

    cv2.calcOpticalFlowFarnebackの3つめNoneは何を意味しているのですか?

    1. umentu_blog

      cv2.calcOpticalFlowFarnebackの返り値と同じ値が出力されます。おそらく、C++だとcv2.calcOpticalFlowFarnebackはvoidの関数のため、3番目の引数であるflowで値を取得しますが、
      Pythonの場合はflowが返り値のため、必要のない仮引数だと思います。

コメントを残す