TLD在VS2013和Matlab2015b下调试运行
一直在研究TLD算法,讲作者提供的代码下载了许久,快一个月了未能跑起来,期间也没再摸索,今天中午觉得没事试试配置一下,没想到将纯VC++的代码、Matlab和VS交叉编译的代码一并跑通了,为了抒发心中的小喜悦,决定开始编写第一篇博客。。。
准备工作
安装Matlab、VS2013以及OpenCV2.4.X版本,并配置相关的环境变量。
修改compile.m文件
include = ' -Ic:\OpenCV2.2\include\opencv\ -Ic:\OpenCV2.2\include\';
libpath = 'c:\OpenCV2.2\lib\';
TLD在这个文件中配置了OpenCV的路径,也就是告诉Matlab知道OpenCV库安装路径在哪里,需要将它改为我们自己本机上的安装路径,以我的为例,放置在D盘下soft文件夹下,详细参考代码:
include = ' -ID:\soft\opencv\build\include\opencv\ -ID:\soft\opencv\build\include\';
libpath = 'D:\soft\opencv\build\x64\vc12\lib\';
需要注意的是在配置include的时候每个-ID前面是有一个空格的,不能够将空格掉了,不然编译的时候会出错。
- VS环境编译
在Matlab的控制板中输入mex –setup(注意-前面有一个空格),显示信息如下:
MEX configured to use 'Microsoft Visual C++ 2013 Professional (C)' for C language compilation.
Warning: The MATLAB C and Fortran API has changed to support MATLAB
variables with more than 2^32-1 elements. In the near future
you will be required to update your code to utilize the
new API. You can find more information about this at:
http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.
To choose a different language, select one from the following:
mex -setup C++
mex -setup FORTRAN
然后选择对应的VS编译器,此处用鼠标 单击mex -setup C++ 即可,提示有警告,不用管它。
- 修改文件
第三步:因为我们这里使用的VC2013,因此需要对mex文件夹中的三个cpp文件: lk.cpp、fern.cpp、bb_overlap.cpp进行小小的修改,将三个文件夹中的
#indef _CHAR16_T
#define CHAR16_T
#endif
将三行注释掉,另在bb_overlap.cpp顶上加入头文件包含:#include “minmax.h”
- matlab编译
到这里配置基本已经完成,我们就可以编译代码,也就是在matlab中运行compile.m文件,会发现一个大家都遇到的错误:
1 ??? Unexpected Standard exception from MEX file.
2 What() is:/Users/liam/projects/OpenCV-2.3.1/modules/core/src/matrix.cpp:1305:
3 error: (-27) create() called for the missing output array in function create
4
5 Error in ==> tldTracking at 30
6 xFJ = lk(2,tld.img{I}.input,tld.img{J}.input,xFI,xFI); % track all points by
7 Lucas-Kanade tracker from frame I to frame J, estimate Forward-Backward error,
8 and NCC for each point
9
10 Error in ==> tldProcessFrame at 25
11 [tBB tConf tValid tld] = tldTracking(tld,tld.bb(:,I-1),I-1,I); % frame-to-frame
12 tracking (MedianFlow)
13
14 Error in ==> tldExample at 41
15 tld = tldProcessFrame(tld,i); % process frame i
16
17 Error in ==> run_TLD at 43
18 [bb,conf] = tldExample(opt);
tldExample(opt);
解决办法是对于lk.cpp文件中的大约在186行,找到这个位置的第二次调用
cvCalcOpticalFlowPyrLK的函数中,将第一个0改为status即可:
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 );
- 运行文件
在上一步编译成功后,打开run_TLD.m文件,点击运行,此时发现还有一个错误,错误就是出现了与什么FSPECIAL相关的错误,意思是说在image工具箱中找不到这个函数,其实Matlab有这个函数,只不过应该是小写的,那么你就是错误的地方将这个错误代码处的FSPECIAL改为fspecial就可以了。 - 完成调试
在以上都完成后,就可以看到期待很久的人骑着摩托奔跑在画面中了,接下来的事就是和各位大神一起解读代码。