记得上次调试这个代码的运行环境,还是一年前。已经记不清楚上次是怎么调通的,只记得调的很痛苦。这次也一样苦闷……话不多说,进入主题。
首先需要在电脑上安装matlab、opencv、vs。
本人最终调试成功的版本为:matlabR2011b,vs2010,opencv2.4.3。
中间还有matlab2009,vs2008,opencv2.2,opencv2.3.1版本的调试,不过失败了……
第一个问题,matlab和vs版本的问题:
首先需要指出,ZK大神开放的源代码是matlab和vs混合编程的,因此需要配置一下matlab中的编译器环境。具体操作为:
在matlab的commond window中输入: mex -setup
然后会出现:
Please choose your compiler for building external interface
(MEX) files:
Would you like mex to locate installed compilers [y]/n?
选择y,回车,此时可能会出现
Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2009b\sys\lcc
[2] Microsoft Visual C++ 6.0 in D:\Program Files\Microsoft Visual
Studio
[0] None
Compiler:
提示选择编译器。假如这个时候没有发现自己安装的vs版本,选择0,回车,y,回车。重新输入 mex -setup,在出现:
Please choose your compiler for building external interface
(MEX) files:
Would you like mex to locate installed compilers [y]/n?
后选择n,回车,此时会出现更多的编译器,如下:
Select a compiler:
[1] Intel C++ 9.1 (with Microsoft Visual C++ 2005 SP1 linker)
[2] Intel Visual Fortran 10.1 (with Microsoft Visual C++ 2005 SP1
linker)
[3] Lcc-win32 C 2.4.1
[4] Microsoft Visual C++ 6.0
[5] Microsoft Visual C++ .NET 2003
[6] Microsoft Visual C++ 2005 SP1
[7] Microsoft Visual C++ 2008
[8] Microsoft Visual C++ 2008 Express Edition
[9] Open WATCOM C++
[0] None
Compiler:
一般情况下就会出现自己的编译器。
注意:matlab和vs有版本兼容的问题。比如matlab2009无法找到vs2010的编译器,但是matlab2011可以。所以会出现你用同样的操作方式,但是得到不同的结果。在无法找到编译器情况下,有网友通过自己手动指定编译器目录也ok了。但是我这样做了还是不行,时间关系就没有再调试这个问题,果断换了高版本的matlab。
以2008为例,具体操作为,
在上面的命令下,输入7,回车,会出现:
The default location for Microsoft Visual C++ 2008 compilers is
C:\Program Files\Microsoft Visual Studio 9.0,
but that directory does not exist on this
machine. Use C:\Program Files\Microsoft Visual Studio 9.0 anyway [y]/n?
此命令的意思是,是否确定路径。输入n,回车,再根据提示将自己的安装目录路径数据进去,后面的就不详述了。
第二个问题,opencv的安装问题
关于opencv的具体配置过程就不详述了,官网和网友的帖子有很详细的说明,但是这里我要说的问题是,opencv的安装路径。
在vs下配置opencv时,可以将其安装在任意路径下,自己也测试的opencv示例程序发现没有问题,但是在运行混编程序时却有可能提示各种问题。例如无法找到include....,无法打开....lib等等。打开TLD中的
compile.m 文件,可以发现两行代码,如下:
include = ' -Ic:\OpenCV2.2\include\opencv\
-Ic:\OpenCV2.2\include\';
libpath = 'c:\OpenCV2.2\lib\';
看到这里就明白了,该环境下的opencv路径是在m文件中指定的。需要把其中的路径改成自己opencv的路径及版本,例如include路径,我的是:
include = ' -ID:\opencv\opencv\build\include\opencv\
-ID:\opencv\opencv\build\include\
-ID:\opencv\opencv\build\include\opencv2\';
需要注意的是,这中间的任何一个空格都可能出现错误。
例如,假如 include = ' -ID:\opencv\opencv\build\include\opencv\
-ID:\opencv\opencv\build\include\
-ID:\opencv\opencv\build\include\opencv2\';中,-ID前面的空格少了,会出现MEX错误。
注意:甚至opencv的安装路径中的空格都可能导致错误。例如:opencv的安装路径在 program files
中,在 -ID中指定路径后,在编译时会出现无法找到inlude文件。个人猜测原因是
program files
中间的空格,matlab会认为是两个路径。解决办法,把opencv拷贝到另一个路径下,在complie.m文件中指定新的opencv路径,而不需要修改原有的opencv配置和环境变量,本人最后就是这样搞定的。
第三个问题,TLD的运行。
在运行complie.m之前,需要在matlab底下用mex设置编译器,命令是
mex -setup 。中间可能遇到的问题见第一条。
这样配置完后,先运行compile.m,编译无错误后再运行TLD,正常情况下就ok了。
还有可能会遇到一些并非混编环境的乱七八糟的小问题,例如可能是matlab版本中有些函数和ZK用的不一样,需要做一些小的调整,根据提示的错误做一些修改。
第四个问题,vs2010及以上版本,需要对lk.cpp fern.cpp bb_overlap.cpp修改,将其中的
#ifdef _CHAR16_T#define CHAR16_T
#endif
再修改掉这一行代码,总算是可以正常运行了。
ZK大神在run_TLD中留下了数据源的接口,稍微修改一下就可以根据自己的兴趣和需要开始测试啦。
本人在调试的时候参考链接如下:
还有几个配置的链接,比较多就不一一放了。在此对网友表示感谢。