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 検出する対象となる部分を決定する
2 Webカメラからフレーム画像を取得する
3 フレーム画像から検出を切り出して、HSV変換する
5 HSV画像からHSV値の範囲を指定してマスク画像の作成する。
6 マスク画像を生成する
7 マスク画像のヒストグラムを正規化する
—-ここからは繰り返し—–
8 Webカメラからフレーム画像を取得する
9 ヒストグラム特徴量からフレーム画像と検出対象の画像の類似度を計算する(calcBackProjectメソッド)
10 フレームから追跡領域の場所を計算する(meanShiftメソッド)
10 計算結果をフレームに描く
11 表示する
—-ここまで繰り返し—-

 

物体検出をしてみる

sourceディレクトリにmeanshift.pyを作成する。

[python title=”meanshift.pyの内容”] # -*- coding: utf-8 -*-

import numpy as np
import cv2

if __name__ == ‘__main__’:

cap = cv2.VideoCapture(0)

# 追跡する枠の座標とサイズ
x = 600
y = 200
w = 200
h = 200
track_window = (x, y, w, h)

# フレームの取得
ret,frame = cap.read()

# 追跡する枠を決定
roi = frame[y:y+h, x:x+w] # 追跡する枠の内部を切り抜いてHSV変換
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
## マスク画像の生成
img_mask = cv2.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
## 正規化するためのヒストグラムの生成
roi_hist = cv2.calcHist([hsv_roi], [0], img_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(True):
ret, frame = cap.read()

if ret == True:
# フレームをHSV変換する
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
img_dst = cv2.rectangle(frame, (x,y), (x+w, y+h), 255, 2)
cv2.imshow(‘SHOW MEANSHIFT IMAGE’, img_dst)

# qを押したら終了。
k = cv2.waitKey(1)
if k == ord(‘q’):
break
else:
break
[/python]

実行してみる。

[shell] (opencv_python) $ python meanshift.py
[/shell]

スクリーンショット 2015-08-07 18.12.11

 

服装はともかく、笑い顔をちゃんと追いかけている。

Related posts

コメントを残す