目的
このチュートリアルでは、次のことを学ぶ
- トラッカーオブジェクトを作成する。
- roiSelector関数を使って、与えられた画像からROIを選択する。
- 与えられた画像内の特定の領域を追跡する。
ソースコード
#include <iostream>
#include <cstring>
int main(
int argc,
char** argv ){
if(argc<2){
cout<<
" Usage: tracker <video_name>\n"
" examples:\n"
" example_tracking_kcf Bolt/img/%04d.jpg\n"
" example_tracking_kcf faceocc2.webm\n"
<< endl;
return 0;
}
std::string video = argv[1];
cap >> frame;
roi=selectROI("tracker",frame);
return 0;
tracker->init(frame,roi);
printf("Start the tracking process, press ESC to quit.\n");
for ( ;; ){
cap >> frame;
if(frame.rows==0 || frame.cols==0)
break;
tracker->update(frame,roi);
rectangle( frame, roi,
Scalar( 255, 0, 0 ), 2, 1 );
imshow("tracker",frame);
if(waitKey(1)==27)break;
}
return 0;
}
n-dimensional dense array class
Definition mat.hpp:840
Template class for 2D rectangles.
Definition types.hpp:444
_Tp width
width of the rectangle
Definition types.hpp:489
_Tp height
height of the rectangle
Definition types.hpp:490
Class for video capturing from video files, image sequences or cameras.
Definition videoio.hpp:786
std::shared_ptr< _Tp > Ptr
Definition cvstd_wrapper.hpp:23
int main(int argc, char *argv[])
Definition highgui_qt.cpp:3
解説
入力動画のセットアップ
if(argc<2){
cout<<
" Usage: tracker <video_name>\n"
" examples:\n"
" example_tracking_kcf Bolt/img/%04d.jpg\n"
" example_tracking_kcf faceocc2.webm\n"
<< endl;
return 0;
}
このチュートリアルでは、プログラムの入力として動画か画像のリストかを選択できる。ヘルプに書かれているとおり、入力動画はプログラムの引数として指定する必要がある。画像リストを入力として使いたい場合は、画像リストはヘルプに示されているように番号がフォーマットされている必要がある。ヘルプにおいては、画像ファイルが4桁の番号で付番されることを意味する(例えばファイル名は0001.jpg、0002.jpgのようになる)。
動画のサンプルは opencv_extra/testdata/cv/tracking にある https://github.com/opencv/opencv_extra/tree/master/testdata/cv/tracking
必要な変数の宣言
追跡対象オブジェクトのバウンディングボックスを記録するためにroiが必要である。この変数に格納される値は、トラッカーオブジェクトによって更新される。
frame変数は、入力動画または画像リストの各フレームの画像データを保持するために使う。
トラッカーオブジェクトの作成
使用できるトラッカーアルゴリズムには、少なくとも7種類ある:
- MIL
- BOOSTING
- MEDIANFLOW
- TLD
- KCF
- GOTURN
- MOSSE
各トラッカーアルゴリズムにはそれぞれ長所と短所があるので、より詳しい情報については cv::Tracker のドキュメントを参照すること。
追跡対象オブジェクトの選択
この関数を使うと、GUIで追跡対象オブジェクトのバウンディングボックスを選択できる。デフォルトの引数では、選択はボックスの中心から開始され、中央に十字が表示される。
トラッカーオブジェクトの初期化
tracker->init(frame,roi);
どのトラッカーアルゴリズムも、与えられた画像データと、追跡対象オブジェクトの初期バウンディングボックスで初期化する必要がある。初期化処理の失敗を避けるため、バウンディングボックスが有効であること(サイズがゼロより大きいこと)を確認すること。
更新
tracker->update(frame,roi);
この更新関数は追跡処理を実行し、結果をroi変数に渡す。