35
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

動画におけるパターン認識学習 その1 Field of Pattern Recognition

Last updated at Posted at 2014-05-04

背景

  • 動画における、任意のパターン認識を目指して、学習していきます。
  • メジャーな画像の顔認識では、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を触るにあたって、必須ではありません。

学習の進め方

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()
35
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?