■ PythonでOpenCV
オプティカルフローを取得するのはOpenCVでやるのがよさそうで、OpenCVで画像処理するならC++よりPythonのほうが色々融通が利く。
ちょうど「ゼロから作るDeep Leraning」のためにAnaconda3を入れてたので、そこでOpenCVを動かして試すのが楽そう。
Deep Learning本を見てた時はコマンドラインでやってたけど、いろいろ調べてたらSpyderという統合環境がAnacondaを入れたときに一緒にインストールされてたことに気づいた。これは便利。
Pythonは10年以上前にバイナリコンバートツールを作った時からちゃんと触ったことがなかったけど、当時より応用範囲が増えてて、速度を問わないことをやるならC++より便利な環境になってる。使い方を覚えておいて損はなさそう。
Windows Anaconda Python 3.5 への OpenCV 3.1 のインストール
スタートメニューから Anaconda3 → Anaconda Prompt を起動し、
conda install -c https://conda.binstar.org/menpo opencv3
と入力。 Anaconda のパッケージマネージャ conda を使ってインストールする。途中で“Proceed?”とか聞かれたので y を入力しエンターキーを押す。
しばらく待つと OpenCV 3.1.0 がインストールされた。
Python版OpenCV入門
顔認識して枠を表示
import numpy as np import cv2 def readFile(filename): image = cv2.imread(filename) gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) # RGB画像をグレースケールに変換 # 分類器を作る cascade_path = "test/haarcascade_frontalface_alt.xml" cascade = cv2.CascadeClassifier(cascade_path) color = (255,255,255) # 顔認識 facerect = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1)) # 認識した顔に枠を表示 if len(facerect) > 0: for rect in facerect: cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2) else: print("no face") cv2.imshow('original',image) cv2.imshow("Show",gray) cv2.waitKey() readFile("test/Lenna.png")
簡単にできてとても素敵。
OpenCVで密なオプティカルフローを計算する
オプティカルフロー(Optical Flow)
いろいろ弄ってたらなんとなくそれっぽいものが出るようになってきた。OpenCVの画像の扱いやパラメータの調整がよくわからないのでまだ試行錯誤が必要そう。
とりあえず、まともに使えるものができてるのか、Unityに出して試してみる予定。
Unityで直接OpenCVが使えたら楽なんだけど、そっちはそっちで別方向にハードルが高そう。とりえずしばらくはPythonで。