Python3 OpenCV3を使って物体検出

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

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

 

物体検出をしてみる

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

実行してみる。

(opencv_python) $ python meanshift.py

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

 

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

Follow me!

コメントを残す

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