背景
- 動画における、任意のパターン認識を目指して、学習していきます。
- メジャーな画像の顔認識では、Facebookが開発しているDeepFaceや、Sky Biometryが提供しているクラウドベースの顔認識API(!)https://www.skybiometry.com/ があったりしますが、この記事の対象は、もっと手を動かしながら技術を理解したい人向けです。
学習素材
- OpenCV: CVは、Computer Visionの略。当時インテルに在籍していた __Gary Bradsky__によって始められた、画像認識ライブラリです。 __数百を超える画像処理アルゴリズム__が使えるらしいです。OpenCV 2.x系は、C++の上に作られているそうです。
- Python 2.7: 自分のMacに入っていたので。また、OpenCVのドキュメントが充実していた言語で、(Rubyやってる)自分が取っ付きやすそうだったので。
- ffmpeg: OpenCVで動画を処理させるために必要なエンコーディングなどしてくれる。OpenCVを触るにあたって、必須ではありません。
学習の進め方
- http://docs.opencv.org/trunk/doc/py_tutorials/py_tutorials.html に書いてあるものをつまみ食いする。
OpenCVのインストール方法 (2014/5) Mac OS X, Mountain Lion
- 基本、Homebrewで。
- brew doctorで出るwarningとか消す
- brew tap homebrew/science
- brew install opencv --with-ffmpeg
- export PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH
- python consoleで、 import cvが通ったら、成功
http://www.jeffreythompson.org/blog/2013/08/22/update-installing-opencv-on-mac-mountain-lion/ 参考
動画の再生
- 下記サンプルでは、毎フレームをグレースケールに変換しながら再生してます。
import numpy as np
import cv2
cap = cv2.VideoCapture('動画へのフルパス')
while(cap.isOpened()):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
- 自分の環境では、フルパスでないと怒られました
動画内のオブジェクトトラッキング(追跡)
MeanShiftアルゴリズム
- 画像の中で、トラッキングしたいエリアの初期座標を与える
- そのエリアを、特徴付ける点の集合として考える(なので、画像処理重要)
- 任意のフレームを考える
- 現在のエリアの中心を計算する
- 現在のエリア内にある、カウントする特徴点の集合の重心(Centroid)を計算する
- エリアの中心と、特徴点の重心が一致していない場合、重心と中心が一致するように、エリアを移動させる
- これを繰り返し、実際に(誤差が十分に少ない状態で)重心と中心が一致した位置を、現在のフレームに置けるオブジェクトの位置を考える
現在のソースコード
import numpy as np
import cv2
cap = cv2.VideoCapture('動画へのフルパス')
ret,frame = cap.read()
r,h,c,w = 150,90,650,125
track_window = (c,r,w,h)
roi = frame[r:r+h, c:c+w]
hsv_roi = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0.,60.,32.)), np.array((180.,255.,255.)))
roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )
while(1):
ret,frame = cap.read()
if ret == True:
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)
ret,track_window = cv2.meanShift(dst, track_window, term_crit)
x,y,w,h = track_window
img2 = cv2.rectangle(frame,(x,y),(x+w,y+h),255,2)
cv2.imshow('img2',frame)
k = cv2.waitKey(60) & 0xff
if k == 27:
break
else:
cv2.imwrite(chr(k)+".jpg",img2)
else:
break
cv2.destroyAllWindows()
cap.release()