又到周六了,不想起床,不过还是要学习呀~
最近最新的论文看的比较多,老师让看一下经典的算法,所以先拿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的路径和版本:
- 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\';
- %D:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\opencv\
- %D:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\
- %D:\MenghanZhou\Han_Tools\VS2013\opencv\build\includeopencv2\
- libpath = 'D:\MenghanZhou\Han_Tools\VS2013\opencv\build\x64\vc12\lib\';
4、如果你是64位系统,打开mex文件夹,找到lk.cpp fern.cpp bb_overlap.cpp,将以下代码注释掉
- //#ifdef _CHAR16T
- //#define CHAR16_T
- //#endif
5、打开lk.cpp,找到其中的186行左右,将Level,0,0改成Level,status,0,具体见下:
- //forward trajectory 前向轨迹跟踪
- 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);
- //backward trajectory 后向轨迹跟踪
- 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行左右修改为:
- files = dir(fullfile(libpath, '*.lib'));
- lib = [];
- for i = 1:length(files),
- lib = [lib ' ' libpath '\' files(i).name];
- 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 对象无效或已删除。
解决办法:按空格退出;
以上基本涵盖了所有可能出现的问题,耐心调一下总会出现那个骑摩托车的小伙子的~~~
感谢前人们的努力,侵删 ~~~