四、算法描述
简单的算法描述如下,编程实现其实也是这个过程。(另外,不知道我的尺度更新的位置对不对,望指点)
(1)t帧:
根据该帧图像I和得到的目标位置x*。顺序进行以下计算:
1)学习空间上下文模型:
2)更新跟踪下一帧目标需要的时空上下文模型:
3)更新尺度等参数:
(2)t+1帧:
1)计算置信图:
2)找到最大值,这个最大值的位置就是我们要求的目标位置:
五、代码实现
我的代码是基于VS2010+OpenCV2.4.2的(暂时还没加入边界处理,也就是跟踪框到达图像边缘的时候就会出错)。代码可以读入视频,也可以读摄像头,两者的选择只需要在代码中稍微修改即可。对于视频来说,运行会先显示第一帧,然后我们用鼠标框选要跟踪的目标,然后跟踪器开始跟踪每一帧。对摄像头来说,就会一直采集图像,然后我们用鼠标框选要跟踪的目标,接着跟踪器开始跟踪后面的每一帧。
另外,为了消去光照的影响,需要先对图像去均值化,还需要加Hamming窗以减少图像边缘对FFT带来的频率影响。Hamming窗如下:
另外,OpenCV没有复数(FFT后是复数)的乘除运算,所以需要自己编写,参考如下:
复数除法:
复数乘法:
具体代码如下:
STCTracker.h
- // 快速对象跟踪算法
- #include <opencv2/opencv.hpp>
- using namespace cv;
- using namespace std;
- class STCTracker
- {
- public:
- STCTracker();
- ~STCTracker();
- void init(const Mat frame, const Rect box);