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


Python3 OpenCV3で画像の特徴点を抽出 に関連。

前提

ディレクトリ構成などはこことかこことか。

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

requirements.txtに上記の一覧を記述して、

$ pip install -r requirements.txt

とすればOpenCV以外の同じ環境が構築できる。

 

オプティカルフローとは

オプティカルフローとは、「視覚表現(通常、時間的に連続するデジタル画像)の中で物体の動きをベクトル」とのこと。
連続するフレームの差分から算出して表示する。

手順は以下のとおり

1 フレーム画像(pre)を取得する。
2 フレーム画像をグレースケール変換する。
3 フレーム画像をHSV変換する。
—-ここからループ—-
4 カメラをキャプチャする。
5 フレーム画像(next)を取得する。
6 グレースケール変換する。
8 preとnextのグレースケール画像からオプティカルフローを計算する。
9 フローの角度と大きさを計算する。
10 計算した角度から色を決定する。
11 結果を表示する。
—-ここまでループ—-

 

オプティカルフローをしてみる

sourceディレクトリに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()

実行してみる。

(opencv_python) $ python optical_flow.py

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

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です