OpenCV にある追跡関係を調査中 

以下の記事はだいぶ古くなっています。
OpenCV4.6 の時点でかなりの追跡アルゴリズムがlegacy に移動しています。

https://docs.opencv.org/4.x/dc/d6b/group__tracking__legacy.html

`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 [<video_source>]

Optical Flowがどのようであるのかを見てとることができます。

しかし、物体の追跡をさせたいと意気込んでいた人には、「これだけでは、どうしたらいいの？」ととまどうことでしょう。


次にopencv_contribにあるPythonスクリプトでそれらしいのを探して見ましょう。
```
$ find opencv_contrib -name '*[Tt]rack*.py' -print
```

**opencv_contrib/modules/tracking/samples/tracker.py**
[cv::TrackerMIL Class Reference](https://docs.opencv.org/3.4.1/d0/d26/classcv_1_1TrackerMIL.html)のPythonバインディングを使った例題です。
追跡開始のROIの枠は、マウスで指定するようになっています。

**opencv_contrib/modules/tracking/samples/multitracker.py**
[cv::MultiTracker Class Reference](https://docs.opencv.org/3.4.1/d8/d77/classcv_1_1MultiTracker.html) の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
```

## チュートリアルを読んでみよう

- [Customizing the CN Tracker ](https://docs.opencv.org/3.4.1/d2/d0a/tutorial_introduction_to_tracker.html)
- [Introduction to OpenCV Tracker ](https://docs.opencv.org/3.4.1/d2/d0a/tutorial_introduction_to_tracker.html)
- [Using MultiTracker ](https://docs.opencv.org/3.4.1/d5/d07/tutorial_multitracker.html)

## チュートリアルに紹介されたソースコード
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