TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生Zdenek Kalal在其攻读博士学位期间提出的一种新的单目标长时间跟踪算法。该算法与传统跟踪算法的显著区别在于将传统的跟踪算法和传统的检测算法相结合来解决被跟踪目标在被跟踪过程中发生的形变、部分遮挡等问题。
本文主要针对 Zdenek 的原生 Matlab 和 C++ 混合编译代码的配置和调试进行讲解。
-
我的环境是 Matlab R2016 、Visual Studio 2013 、opencv 2.4.9。这里注意一下最好使用opencv2,否则使用opencv3可能会引起更多问题,而VS目测作者使用的是2008,不过2010以上版本也不会有太大问题,只需要改一行代码,这个后面会说。
-
下好opencv和VS后,注意在VS里配置好opencv的安装路径和 lib,这里讲解的博客很多,读者可自行查阅。注意要把 opencv 安装路径放入环境变量 Path,否则会出现:
Error:Invalid MEX-file ‘xxxx’:找不到指定的模块
-
在matlab里面运行mex -setup,选择 C++。
-
在matlab里面打开compile.m文件,把里面的对OpenCV的绝对路径改成自己在电脑上安装的OpenCV的路径。例如:
include = '-ID:\opencv\build\include\opencv\ -ID:\opencv\build\include\opencv2\ -ID:\opencv\build\include\';
libpath = 'D:\opencv\build\x64\vc12\lib\';
- ( VS2010 以上版本)点开mex文件夹,将文件lk.cpp、fern.cpp、bb_overlap.cpp 文件中的下面三句话注释掉:
#ifdef_CHAR16T
#define CHAR16_T
#endif
否则会出现:
error C4430:缺少类型说明符-假定为int。注意:C++不支持int。
- 在mex文件夹下bb_overlap.cpp文件的头部加上下面代码。
#include "minmax.h"
否则会出现:
error C3861: “min”: 找不到标识符
- 将 lk.cpp 里面的:
cvCalcOpticalFlowPyrLK( IMG[J], IMG[I], PYR[J], PYR[I], points[1], points[2], nPts, cvSize(win_size,win_size), Level,0,0,cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03), CV_LKFLOW_INITIAL_GUESSES | CV_LKFLOW_PYR_A_READY | CV_LKFLOW_PYR_B_READY );
改为:
cvCalcOpticalFlowPyrLK( IMG[J], IMG[I], PYR[J], PYR[I], points[1], points[2], nPts, cvSize(win_size,win_size), Level, status , 0, cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03), CV_LKFLOW_INITIAL_GUESSES | CV_LKFLOW_PYR_A_READY | CV_LKFLOW_PYR_B_READY );
否则运行 compile.m 进行 mex 时会报错。
- 将 img_blur.m 里的这一行代码:
h = FSPECIAL('gaussian',csize,sigma);
改为:
h = fspecial('gaussian',csize,sigma);
否则会出现:
Error: 找不到 ‘FSPECIAL’ 的完全匹配项(区分大小写)。
- (调用摄像头)将initcamera.m里的这两行代码中的 x 位置改为自己摄像头的属性编号:
source.vid = videoinput('winvideo', x, 'YUY2_640x480');
opt.source = struct('camera',x,'input','_input/','bb0',[])
- 代码运行完不要直接叉掉,须按空格退出。
否则会出现:
Error: 错误使用 matlab.graphics.primitive.Image/set ,对象无效或已删除。
注意上述问题后,依次运行 compile.m、initcamera.m、run_TLD.m 即可运行TLD程序了。
最后附上我的效果图:(真容是不可能有滴)
虽说左下角 FPS 较低,但确实没什么卡帧、停顿的感觉。