跟踪就是在连续视频帧中定位物体,通常的跟踪算法包括以下几类:
1. Dense OpticalFlow 稠密光流
2. Sparse OpticalFlow 稀疏光流 最典型的如KLT算法(Kanade-Lucas-Tomshi)
3. Kalman Filter
4. Meanshift andCamshift
5. Multiple objecttracking
需要注意跟踪和识别的区别,通常来说跟踪可以比识别快很多,且跟踪失败了可以找回来。
OpenCV 3以后实现了很多追踪算法,都实现在contrib模块中,安装参考。
下面code实现了跟踪笔记本摄像头画面中的固定区域物体,可以选用OpenCV实现的算法
#include<opencv2/opencv.hpp>
#include<opencv2/tracking.hpp>
usingnamespace std;
usingnamespace cv;
int main(int argc,char** argv){
// can change to BOOSTING, MIL, KCF (OpenCV 3.1), TLD, MEDIANFLOW, orGOTURN (OpenCV 3.2)
Ptr<Tracker> tracker = Tracker::create("MEDIANFLOW");
VideoCapture video(0);
if(!video.isOpened()){
cerr << "cannot read video!" << endl;
return -1;
}
Mat frame;
video.read(frame);
Rect2d box(270,120, 180, 260);
tracker->init(frame, box);
while(video.read(frame)){
tracker->update(frame, box);
rectangle(frame, box, Scalar(255,0, 0), 2, 1);
imshow("Tracking", frame);
int k=waitKey(1);
if(k==27) break;
}
}
这里介绍一下使用OpenCV进行目标跟踪的方法,之前用过一点。opencv中目标跟踪的一些比较新的方法(比如MIL、KCF、TLD等)都在opencv_contrib库里,所以首先你需要安装它,详见Opencv3.1.0+opencv_contrib配置及使用SIFT测试 。
关于tracking这一块可参考Opencv的官网 Tracking API 、Introduction to OpenCV Tracker 。
如果只是想要测试下非常简单,官网都给了例程;要深入了解其原理,查看相关论文即可。关于其效果的话,看你的使用场合和怎么理解了。
这里贴一下我根据例程稍作修改的测试程序。
源码: