众所周知,OpenCV提供了8种目标跟踪算法,它们是:
- BOOSTING
- MIL
- KCF
- TLD
- MEADIANFLOW
- GOTURN
- MOSSE
- CSRT
而OpenCVSharp (4.5x)中,实现了常用的四种:MIL、KCF、GOTURN、CSRT。
具体而言,它们是在OpenCVSharp.Tracking 命名空间下的 TrackerCSRT, TrackGOTURN, TrackerKCF, TrackerMIL 等类。
这些跟踪器用法几乎是一模一样的,基本上是先用 Create()方法获得一个算法实例、用跟踪目标ROI初始化 Init( ), 然后以视频帧的听像数据更新 Update( ), 获得目标的新位置从而实现对目标的跟踪。
private void button2_Click(object sender, EventArgs e)
{
play = true;
if (pictureBox2.Image != null)
{
switch (comboBox1.SelectedIndex)
{
case 0:
default:
tracker = TrackerCSRT.Create();
break;
case 1:
tracker = TrackerGOTURN.Create();
break;
case 2:
tracker = TrackerKCF.Create();
break;
case 3:
tracker = TrackerMIL.Create();
break;
}
tracker.Init(currentFrame, roi);
}
}
private void timer1_Tick(object sender, EventArgs e)
{
if (play)
{
capture.Read(currentFrame);
if (currentFrame.Empty())
{
play = false;
pictureBox1.Image = null;
pictureBox2.Image = null;
timer1.Enabled = false;
return;
}
if (pictureBox2.Image != null && tracker != null)
{
tracker.Update(currentFrame, ref roi);
Cv2.Rectangle(currentFrame, roi, Scalar.Red);
}
pictureBox1.Image = BitmapConverter.ToBitmap(currentFrame);
}
}
由于GOTURN是基于深度学习模型的算法,所以需要提供训练好的模型文件(放置在运行目录下)。模型文件可以从这里下载:https://github.com/spmallick/goturn-files
为了方便对比几种算法的效果,这里编写了一个带GUI界面的程序。选择好跟踪算法,加载视频文件后,可以用鼠标画出想跟踪的目标,然后播放视频就可以看到目标跟踪的效果。
(视频播放时也可随时选取,重新播放即可)
图中这段视频中,衣着差不多的一群人来回地在三岔路口走动,聚集又散开,不断穿插,甚至倒着走,再加上故意设置的周围环境影响(尤其是灯柱),对目标跟踪算法是一个极大的考验。
VS2019工程打包在这里:https://download.csdn.net/download/jimtien/20687207