长期跟踪经典之作1--- TLD 算法(Matlab2016a和C++混编运行)

又到周六了,不想起床,不过还是要学习呀~

最近最新的论文看的比较多,老师让看一下经典的算法,所以先拿TLD开刀咯~

需要先运行一下,然后看论文,分析代码~

还是老配置(注意和文中不同,我是win7 64+Matlab2016a 64+VS2013),老配方,运行成功后记录一下;

以下开始粘贴复制。。。。

原文链接1:https://blog.csdn.net/sgfmby1994/article/details/55003138   基础版;

原文链接2:https://blog.csdn.net/zinnc/article/details/47056777       错误纠正版;


步骤如下:

1、在matlab的command window中输入:mex_setup  选择 y 回车,并选择相应的VS编译器  (这里需要注意:MATLAB 的版本要高于VS的版本才可以,比如我的是matlab R2012a  ,我在选择编译器版本时只能选择VS2010,虽然我的电脑中也安装了VS2013)详细过程见下面的截图:



2、安装opencv (我安装的是opecv 2.4.12) 安装教程可以参见网上,以后应该也会写一个完整的版本。


3、打开TLD的compile.m文件

  将下面的信息修改成自己的opencv的路径和版本:

[plain]  view plain  copy
  1. include = ' -ID:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\opencv\ -ID:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\ -ID:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\opencv2\';  
  2. %D:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\opencv\  
  3. %D:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\  
  4. %D:\MenghanZhou\Han_Tools\VS2013\opencv\build\includeopencv2\  
  5. libpath = 'D:\MenghanZhou\Han_Tools\VS2013\opencv\build\x64\vc12\lib\';  

  注意其中的空格!!!!


4、如果你是64位系统,打开mex文件夹,找到lk.cpp  fern.cpp bb_overlap.cpp,将以下代码注释掉   

[cpp]  view plain  copy
  1. //#ifdef _CHAR16T  
  2. //#define CHAR16_T  
  3. //#endif  


5、打开lk.cpp,找到其中的186行左右,将Level,0,0改成Level,status,0,具体见下:

[plain]  view plain  copy
  1.          //forward trajectory 前向轨迹跟踪    
  2. cvCalcOpticalFlowPyrLK( IMG[I], IMG[J], PYR[I], PYR[J], points[0], points[1], nPts, cvSize(win_size,win_size), Level, status, 0, cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03), CV_LKFLOW_INITIAL_GUESSES);  
  3. //backward trajectory 后向轨迹跟踪    
  4.          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 );  


6、打开compile.m,第30行左右修改为:

[plain]  view plain  copy
  1. files = dir(fullfile(libpath, '*.lib'));  
  2. lib = [];  
  3. for i = 1:length(files),  
  4.     lib = [lib ' ' libpath '\' files(i).name];  
  5. end  


7、运行compile.m,出现compilation finished。哈哈,ok!!


8、把img\img_blur.m中的第29行的FSPECIAL改成小写fspecial,运行run_TLD.m

  出现下图这种对原图像中每帧图像目标boundingbox的跟踪,则说明运行成功啦!!



另外,可能会提示.....不是有效的32位程序类似的错误,这时的解决方法是:

将系统环境变量中的opencv bin目录中的×86改为×64



修改完之后,记得要重启matlab再运行程序。


9.TroubleShooting:

Error: 无法找到"Program Files..."

解决办法:include和libpath中的opencv路径不能有空格。将opencv的安装包extract到别的盘符下,重新cmake一遍,再用vs编译一遍。见《opencv3编程入门》


Error: 错误使用 mex
   正在创建库 lk.lib 和对象 lk.exp
lk.obj : error LNK2019: 无法解析的外部符号 cvAlloc,该符号在函数 mexFunction 中被引用....

解决办法:对于x64系统,需将libpath = 'd:\opencv\build\x86\vc12\lib\';改为libpath = 'd:\opencv\build\x64\vc12\lib\';


Error: c:\Matlab\r2014b\extern\include\matrix.h(266) : error CC4430:缺少类型说明符 -假定为int。注意:C++不支持int

解决办法:

在lk.cpp, fern.cpp, and bb_overlap.cpp中注释掉这些代码: #ifdef _CHAR16_T #define CHAR16_T #endif


Error: bb_overlap.cpp(35) : error C3861: “min”:  找不到标识符

解决办法:修改TLD代码包中mex文件夹下bb_overlap.cpp文件,在头部加上#include "minmax.h"



Error: 找不到 'FSPECIAL' 的完全匹配项(区分大小写)。

解决办法:h = FSPECIAL('gaussian',csize,sigma);改为fspecial


Error:Invalid MEX-file 'D:\TLD\OpenTLD-master\mex\lk.mexw64':找不到指定的模块

解决办法:虽然安装了OpenCV,但是没有将DLL添加到Path中,lk.mexw64(其实也是个DLL)就会找不到关于opencv的DLL。在环境变量->系统变量->Path中添加openCV的dll路径,如d:\opencv\build\x64\vc12\bin. (x64指64位系统,vc12指vs2013),改完后要重启系统。原帖:https://github.com/kyamagu/mexopencv#2-install-opencv-library


Error: 执行run_TLD.m后,点×关掉窗口,显示:错误使用 matlab.graphics.primitive.Image/set 对象无效或已删除。

解决办法:按空格退出;


以上基本涵盖了所有可能出现的问题,耐心调一下总会出现那个骑摩托车的小伙子的~~~


感谢前人们的努力,侵删 ~~~



猜你喜欢

转载自blog.csdn.net/skywalker_123/article/details/79939515
tld