OpenCVの物体追跡


 

目次

1. OpenCVの物体追跡の概要
1.1 物体追跡とは
1.2 OpenCV
2. 実験
2.1 環境の準備
2.2 コード
2.3 結果の動画

 

1. OpenCVの物体追跡の概要

1.1 物体追跡とは

物体追跡とは,与えられた動画から,指定した対象が各画像間でどのように移動したかを推定することです。動画の中を移動する物体の動きをトラッキング(追跡)することが出来れば、その物体の変位や速度、加速度といった物理量を計算することが出来ます。

 

1.2 OpenCVの物体追跡

OpenCVには物体追跡アルゴリズムがopencv-contrib-pythonとして提供されています。画像処理の方法がOpenCVに6つ実装されています。

 

MILMultiple Instance Learning

考え方としてはBoostingにとても近いけど、分類対象の場所の近傍のサンプルについてもいくつか正の場所として扱うことが特徴です。

cv2.TrackerMIL_create()

 

KCFKernelized Correlation Filters

MILの近傍サンプルにはそれぞれ同士でオーバーラップする部分があって、その領域を加味することで性能を上げたらしいです。

cv2.TrackerKCF_create()

 

TLD(Tracking, learning and detection)

性質上、似たような他のものとの入れ替わりには引っ張られたりすることがあります。ただ、長い間遮られたりするものやスケールが大幅に変わるものには適しているらしいです。

cv2.TrackerTLD_create()

 

MedianFlow

オブジェクトを時間的に順方向および逆方向の両方で追跡して、これらの軌跡間の差異を測定します。

cv2.TrackerMedianFlow_create()

 

GOTURN

深層学習を使ったトラッキング手法なため、向いているハードウェアに搭載すればとても早いらしいです。

cv2.TrackerGOTURN_create()

 

MOSSE

最小出力二乗誤差の合計(MOSSE)は、オブジェクトトラッキングのための適応相関を使用します。MOSSE Trackerは、照明、スケール、ポーズ、および非剛体変形の変動に対してロバストです。

cv2.TrackerMOSSE_create()

 

CSRT

チャネルおよび空間信頼性を有する識別相関フィルタ(DCF − CSR)では、空間信頼性マップを使用して、追跡のためにフレームから選択された領域の一部にフィルタサポートを調整します。

cv2.TrackerCSRT_create()

 

2. 実験

2.1 環境の準備

環境:Python environment : 3.6.10

IDE:Pycharm

パッケージ:

opencv-python (Version 4.5.2.52)

opencv-contrib-python (Version 4.5.2.52)

 

2.2 コード

下記のコードは4つの作業を行います。

1)動画ファイルを読み込みます。

2)対象物体を指定します。

3)対象物体の追跡を作成します。

4)対象物体の追跡のバウンダーボックスを作成します。

 

import cv2

 

file = “movie.mp4”

cap = cv2.VideoCapture(file)  # 0 for Camera

 

# Create tracker

tracker = cv2.TrackerMIL_create()

success, img = cap.read()

 

# Create bbox

bbox = cv2.selectROI(“Tracking”, img, False)

tracker.init(img, bbox)

 

font = cv2.FONT_HERSHEY_SIMPLEX

 

 

def drawBox(img, bbox):

# Box drawing function

x, y, w, h = int(bbox[0]), int(bbox[1]), int(bbox[2]), int(bbox[3])

cv2.rectangle(img, (x, y), ((x+w), (y+h)), (255, 0, 0), 3, 1)

cv2.putText(img, ‘Tracking’, (15, 70), font, 0.5, (0, 0, 255), 2)

 

while True:

timer = cv2.getTickCount()

success, img = cap.read()

 

success, bbox = tracker.update(img)

if success:

drawBox(img, bbox)

else:

cv2.putText(img, ‘Tracking Lost’, (15, 70), font, 0.5, (0, 0, 255), 2)

 

# Frame rate per second

fps = cv2.getTickFrequency()/(cv2.getTickCount()-timer)

cv2.putText(img, “fps” + str(int(fps)), (15, 30), font, 0.5, (255, 255, 255), 2)

 

cv2.imshow(“Tracking”, img)

 

if cv2.waitKey(1) & 0xff == ord(‘q’):

break

 

2.3 結果の動画

コードを実行すると、マウスで対象物体を選択します。バウンダーボックスは対象物体の追跡が出来ました。

 

担当者:HM

香川県高松市出身 データ分析にて、博士(理学)を取得後、自動車メーカー会社にてデータ分析に関わる。その後コンサルティングファームでデータ分析プロジェクトを歴任後独立 気が付けばデータ分析プロジェクトだけで50以上担当

理化学研究所にて研究員を拝命中 応用数理学会所属