以下の記事はだいぶ古くなっています。
OpenCV4.6 の時点でかなりの追跡アルゴリズムがlegacy に移動しています。
cv2.TrackerMIL_create
から
cv2.legacy.TrackerMIL_create
へと変更になっています。
OpenCV にあるTracking関係のスクリプト
まずは、OpenCVのPythonスクリプトでそれらしいのを探して見ましょう。
$ find opencv -name '*[Tt]rack*.py' -print
opencv/modules/python/test/test_lk_track.py
opencv/samples/python/plane_tracker.py
Multitarget planar tracking
==================
Example of using features2d framework for interactive video homography matching.
ORB features and FLANN matcher are used. This sample provides PlaneTracker class
and an example of its usage.
video: http://www.youtube.com/watch?v=pzVbhxx6aog
Usage
-----
plane_tracker.py [<video source>]
Keys:
SPACE - pause video
c - clear targets
Select a textured planar object to track by drawing a box with a mouse.
opencv/samples/python/lk_track.py
Lucas-Kanade sparse optical flow demo.
特徴点がどのように追跡されているのかを見ることができます。
動画入力は起動時に指定することができます。
lk_track.py []
Optical Flowがどのようであるのかを見てとることができます。
しかし、物体の追跡をさせたいと意気込んでいた人には、「これだけでは、どうしたらいいの?」ととまどうことでしょう。
次にopencv_contribにあるPythonスクリプトでそれらしいのを探して見ましょう。
$ find opencv_contrib -name '*[Tt]rack*.py' -print
opencv_contrib/modules/tracking/samples/tracker.py
cv::TrackerMIL Class ReferenceのPythonバインディングを使った例題です。
追跡開始のROIの枠は、マウスで指定するようになっています。
opencv_contrib/modules/tracking/samples/multitracker.py
cv::MultiTracker Class Reference のpythonバインディングを使った例題です。
複数の追跡対象を最初のフレームで、追跡開始のROIの枠を、マウスで指定するようになっています。
追跡についての一般的なものになっているため、ここでは追跡の開始をマウスで指定するものになっています。人追跡を開始させたいのであれば、人検出器を利用して、その検出結果の枠位置を追跡の開始に指定すればいい。
検出器による検出結果をトリガーとしてオブジェクトの追跡をするPythonスクリプトはOpenCV自体の中には無いようです。
それには、cv2 を使っているPythonの例題を検索してみるのが良さそうです。
次は、C++自体で書かれている追跡関連が入っているらしいソースコードを探してみることにしましょう。
$ find opencv -name '[tT]rack.cpp' -print
opencv/build/modules/tracking/opencl_kernels_tracking.cpp
opencv/modules/objdetect/src/detection_based_tracker.cpp
opencv/modules/imgproc/test/test_goodfeaturetotrack.cpp
opencv/modules/imgproc/perf/perf_goodFeaturesToTrack.cpp
opencv/samples/cpp/tutorial_code/TrackingMotion/goodFeaturesToTrack_Demo.cpp
opencv/samples/cpp/tutorial_code/HighGUI/AddingImagesTrackbar.cpp
opencv/samples/cpp/tutorial_code/HighGUI/BasicLinearTransformsTrackbar.cpp
opencv/samples/cpp/tutorial_code/features2D/AKAZE_tracking/planar_tracking.cpp
opencv/samples/android/face-detection/jni/DetectionBasedTracker_jni.cpp
$ find opencv_contrib -name '[tT]rack.cpp' -print
opencv_contrib/modules/datasets/src/track_vot.cpp
opencv_contrib/modules/datasets/src/track_alov.cpp
opencv_contrib/modules/datasets/samples/track_vot.cpp
opencv_contrib/modules/tracking/test/test_trackers.cpp
opencv_contrib/modules/tracking/test/test_trackerParametersIO.cpp
opencv_contrib/modules/tracking/perf/perf_Tracker.cpp
opencv_contrib/modules/tracking/src/trackerCSRT.cpp
opencv_contrib/modules/tracking/src/trackerCSRTScaleEstimation.cpp
opencv_contrib/modules/tracking/src/trackerMILModel.cpp
opencv_contrib/modules/tracking/src/trackerCSRTSegmentation.cpp
opencv_contrib/modules/tracking/src/gtrTracker.cpp
opencv_contrib/modules/tracking/src/trackerKCF.cpp
opencv_contrib/modules/tracking/src/trackerFeature.cpp
opencv_contrib/modules/tracking/src/multiTracker_alt.cpp
opencv_contrib/modules/tracking/src/trackerBoosting.cpp
opencv_contrib/modules/tracking/src/mosseTracker.cpp
opencv_contrib/modules/tracking/src/trackerMIL.cpp
opencv_contrib/modules/tracking/src/trackerCSRTUtils.cpp
opencv_contrib/modules/tracking/src/trackerMedianFlow.cpp
opencv_contrib/modules/tracking/src/trackerModel.cpp
opencv_contrib/modules/tracking/src/trackerSampler.cpp
opencv_contrib/modules/tracking/src/tracking_utils.cpp
opencv_contrib/modules/tracking/src/trackerFeatureSet.cpp
opencv_contrib/modules/tracking/src/tracker.cpp
opencv_contrib/modules/tracking/src/multiTracker.cpp
opencv_contrib/modules/tracking/src/tldTracker.cpp
opencv_contrib/modules/tracking/src/trackerSamplerAlgorithm.cpp
opencv_contrib/modules/tracking/src/trackerStateEstimator.cpp
opencv_contrib/modules/tracking/src/trackerBoostingModel.cpp
opencv_contrib/modules/tracking/samples/tutorial_introduction_to_tracker.cpp
opencv_contrib/modules/tracking/samples/tracker_dataset.cpp
opencv_contrib/modules/tracking/samples/goturnTracker.cpp
opencv_contrib/modules/tracking/samples/tutorial_multitracker.cpp
opencv_contrib/modules/tracking/samples/multiTracker_dataset.cpp
opencv_contrib/modules/tracking/samples/tracker.cpp
opencv_contrib/modules/tracking/samples/tutorial_customizing_cn_tracker.cpp
opencv_contrib/modules/tracking/samples/multitracker.cpp
$ find opencv_contrib -name '*[tT]rack*.markdown' -print
opencv_contrib/modules/tracking/tutorials/tutorial_customizing_cn_tracker.markdown
opencv_contrib/modules/tracking/tutorials/tutorial_multitracker.markdown
opencv_contrib/modules/tracking/tutorials/tutorial_introduction_to_tracker.markdown
チュートリアルを読んでみよう
チュートリアルに紹介されたソースコード
opencv_contrib/modules/tracking/samples/tutorial_customizing_cn_tracker.cpp
opencv_contrib/modules/tracking/samples/tutorial_multitracker.cpp
opencv_contrib/modules/tracking/samples/tutorial_introduction_to_tracker.cpp
チュートリアルには紹介されていないサンプルのソースコード
opencv_contrib/modules/tracking/samples/tracker_dataset.cpp
opencv_contrib/modules/tracking/samples/goturnTracker.cpp
opencv_contrib/modules/tracking/samples/multiTracker_dataset.cpp
opencv_contrib/modules/tracking/samples/tracker.cpp
opencv_contrib/modules/tracking/samples/multitracker.cpp