LoginSignup
1
2

More than 5 years have passed since last update.

Pythonでキーワード分岐する時どう書くか(テンプレートトラッキングへの応用)

Last updated at Posted at 2018-11-27

PythonにはSwitch文がありません。
長い処理分岐は難しいですが手法のキーワードに合わせて処理を微修正する程度なら以下の記事のように辞書型の記述を行うことで生成可能です。
https://qiita.com/hasegit/items/2cf05de74680717f9010

例えば,以下がopencvでの特徴点抽出に用いる特徴量記述方法によってDescriptorを分岐させる関数です。

def get_des(name):
    return {
        'ORB': cv2.ORB_create(nfeatures=500,scoreType=cv2.ORB_HARRIS_SCORE),
        'AKAZE': cv2.AKAZE_create(),
        'KAZE' : cv2.KAZE_create(),
        'SIFT' : cv2.xfeatures2d.SIFT_create(),
        'SURF' : cv2.xfeatures2d.SURF_create()
    }.get(name, 0)  

特徴ベースのテンプレートトラッキングで使用しました。

プログラム例

以上の手法を用いてこちらのブログのテンプレートトラッキングの手法を分岐させます。大変参考になりました。

元のファイルに対する主な変更点として,

  • 引数に「ビデオのファイル名」,「手法名」,「デフォルトのROI」を渡すことで選択可能にした
  • 使える手法:Boosting,MIL,KCF,TLD,MedianFlow

があります。

import cv2
import sys
import numpy as np

def get_tracker(name):
    """
    キーワードに応じてTrackerを選択
    """
    return {
        'Boosting': cv2.TrackerBoosting_create(),
        'MIL': cv2.TrackerMIL_create(),
        'KCF' : cv2.TrackerKCF_create(),
        'TLD' : cv2.TrackerTLD_create(),
        'MedianFlow' : cv2.TrackerMedianFlow_create()
    }.get(name, 0)  

def extractROI(frame,roi):
    return frame[int(roi[1]):int(roi[1]+roi[3]),int(roi[0]):int(roi[0]+roi[2])]


if __name__ == '__main__':
    """
    引数1:ファイル名,引数2:Method名,引数3:BoundingBox

    Method: Boosting, MIL, KCF, TLD, MedianFlow
    """
    ##---------- File name -----------##
    try:
        filename = sys.argv[1]
    except:
        filename = 'Videos/square50.avi'

    ##---------- Method ----------------##
    try:
        method = sys.argv[2]
    except:
        method = 'KCF'
    print('USE '+method+' Tracker!')
    ##----------  Tuple --------------- ##
    try:
        bbox = eval(sys.argv[3])
        print(bbox)
        hasframe = 1
    except:
        hasframe = 0

    cap = cv2.VideoCapture(filename)
    ret, frame = cap.read()
    if not ret:
        print('Can not open file:' + filename +'!')
        exit(-1)

    # capture the frame
    if not hasframe:
        bbox = cv2.selectROI(frame, False)
        print(bbox)
        cv2.destroyAllWindows()

    # Load tracker
    tracker = get_tracker(method)
    ok = tracker.init(frame, bbox)


    while True:
        # VideoCaptureから1フレーム読み込む
        ret, frame = cap.read()
        if not ret:
            k = cv2.waitKey(1)
            if k == 27 :
                break
            continue

        # Start timer
        timer = cv2.getTickCount()

        # トラッカーをアップデートする
        track, bbox = tracker.update(frame)

        # FPSを計算する
        fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer)

        # 検出した場所に四角を書く
        if track:
            # Tracking success
            drawrect(frame,bbox)

        else :
            # トラッキングが外れたら警告を表示する
            cv2.putText(frame, "Failure", (10,50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1, cv2.LINE_AA)

        # FPSを表示する
        cv2.putText(frame, "FPS : " + str(int(fps)), (10,20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1, cv2.LINE_AA)

        # 加工済の画像を表示する
        cv2.imshow("Tracking", frame)

        # キー入力を1ms待って、k が27(ESC)だったらBreakする
        k = cv2.waitKey(1)
        if k == 27 :
            break

# キャプチャをリリースして、ウィンドウをすべて閉じる
cap.release()
cv2.destroyAllWindows()

環境はOpenCV3.4,Python3.5です。
雑ですがメモとして。

1
2
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
1
2