TLD在VS2013和Matlab2015b下调试运行

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就可以了。
  • 完成调试
    在以上都完成后,就可以看到期待很久的人骑着摩托奔跑在画面中了,接下来的事就是和各位大神一起解读代码。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值