环境:OpenCV 4.2.0 / OpenCV-contrib 4.2.0 / Visual studio 2017
本以为OpenCV没有封装好的目标跟踪算法,然后前几天一直去找各种算法的源码,但是也不亏,算是装了一万遍OpenCV的环境了解了下不同版本OpenCV吧,┑( ̄Д  ̄)┍
然后发现居然在OpenCV只是需要调一行代码的事情:
Ptr<Tracker> tracker;
tracker = TrackerBoosting::create();
tracker = TrackerMIL::create();
tracker = TrackerKCF::create();
tracker = TrackerTLD::create();
tracker = TrackerMedianFlow::create();
tracker = TrackerMOSSE::create();
tracker = TrackerCSRT::create();
没错,就是这么简单。
然后写了一段小程序测试这些代码。利用不同视频。以下是代码:
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/core/ocl.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat frame;
Rect2d roi;
// Create a tracker 创建跟踪器
Ptr<Tracker> tracker;
//跟踪算法类型
//string trackerTypes[7] = { "BOOSTING", "MIL", "KCF", "TLD","MEDIANFLOW", "MOSSE", "CSRT" };
string videoName;
while (true)
{
while (true)
{
cout << "\n\n------------------------------------------------------------------\n";
cout << "\n\n>> 可测试算法有 BOOSTING MIL KCF TLD MEDIANFLOW MOSSE CSRT"
"\n>> 请输入要测试的算法并按回车,退出输入exit。"
"\n>> ";
string trackerType;
cin >> trackerType;
if (trackerType == "exit")
{
return 0;
}
if (trackerType == "BOOSTING")
{
tracker = TrackerBoosting::create();
cout << "\n>> 选择BOODSTING成功!\n";
break;
}
else if (trackerType == "MIL")
{
tracker = TrackerMIL::create();
cout << "\n>> 选择MIL成功!\n";
break;
}
else if (trackerType == "KCF")
{
tracker = TrackerKCF::create();
cout << "\n>> 选择KCF成功!\n";
break;
}
else if (trackerType == "TLD")
{
tracker = TrackerTLD::create();
cout << "\n>> 选择TLD成功!\n";
break;
}
else if (trackerType == "MEDIANFLOW")
{
tracker = TrackerMedianFlow::create();
cout << "\n>> 选择MEDIANFLOW成功!\n";
break;
}
else if (trackerType == "MOSSE")
{
tracker = TrackerMOSSE::create();
cout << "\n>> 选择MOSSE成功!\n";
break;
}
else if (trackerType == "CSRT")
{
tracker = TrackerCSRT::create();
cout << "\n>> 选择CSRT成功!\n";
break;
}
else
{
cout << "\n>> 选择失败\n";
continue;
}
}
while (true)
{
cout << "\n +--------------+"
"\n | 1.步行的人_1 |"
"\n | 2.步行的人_2 |"
"\n | 3.步行的人_3 |"
"\n | 4.车 |"
"\n | 5.超车 |"
"\n | 6.大卫 |"
"\n | 7.跳绳 |"
"\n | 8.摩托越野 |"
"\n | 9.熊猫 |"
"\n | 10.大众汽车 |"
"\n +--------------+"
"\n\n>> 请输入要播放视频的序列号(例如4)"
"\n>> ";
int videoNo;
cin >> videoNo;
if (videoNo == 1)
{
videoName = "pedestrian1.mpg";
cout << "\n>> 选择《步行的人 1》成功!";
break;
}
else if (videoNo == 2)
{
videoName = "pedestrian2.mpg";
cout << "\n>> 选择《步行的人 2》成功!";
break;
}
else if (videoNo == 3)
{
videoName = "pedestrian3.mpg";
cout << "\n>> 选择《步行的人 3》成功!";
break;
}
else if (videoNo == 4)
{
videoName = "car.mpg";
cout << "\n>> 选择《车》成功!";
break;
}
else if (videoNo == 5)
{
videoName = "carchase.mpg";
cout << "\n>> 选择《超车》成功!";
break;
}
else if (videoNo == 6)
{
videoName = "david.mpg";
cout << "\n>> 选择《大卫》成功!";
break;
}
else if (videoNo == 7)
{
videoName = "jumping.mpg";
cout << "\n>> 选择《跳绳》成功!";
break;
}
else if (videoNo == 8)
{
videoName = "motocross.mpg";
cout << "\n>> 选择《摩托越野》成功!";
break;
}
else if (videoNo == 9)
{