OpenTLD算法是做什么的,我就不多介绍了,很多人前辈都介绍过了。我参考的博客有
看了这个挺好玩的,就打算自己编译一下跑跑看。
我的环境是win7 + vs2010 原来装了个opencv2.3.1(也是网上下载的,不是那种自己编译安装的,所以少了一些工程文件,这个让我在编译OpenTLD的时候搞了好久才搞明白)
首先下载OpenTLD,下载的网址是:
GitHub - alantrrs/OpenTLD: :eyes: C++ implementation of TLD
下载后解压到了C盘,我的OpenCV也是在C盘。
接着要用Cmake来生成VS2010的工程文件,需要先下载Cmake,下载的地址:
http://www.cmake.org/files/v2.8/cmake-2.8.10.2-win32-x86.exe
下载安装好后,需要设置环境变量,添加(这个根据你自己的opencv安装路径来)
OpenCV_DIR=C:\opencv\build
接下来就是从开始菜单找到“Visual Studio 命令提示(2010)”,进入命令行,cd到你解压的opentld目录,接下执行如下命令。
mkdir build
cd build
cmake ../src/
这个过程报错,说找不到FindOpenCV.cmake文件,
这个时候就到网上下载FindOpenCV.cmake文件,地址是http://opencv.willowgarage.com/wiki/FindOpenCV.cmake,把这个页面中FindOpenCV.cmake的内容拷下来,保存到src目录。再执行cmake ../src/ 应该就会成功了。
(我的opencv 2.3.1是网上下载的,不需要自己编译,所以这个过程中出现了问题,提示少了OpenCVConfig.cmake文件,找来找去没有,只好重新用cmake命令到opencv的build目录去执行了一下cmake ../src/,生成成功,接着在opentld的build目录执行cmake ../src/就没问题了)。
生成工程成功以后,就是导入到vs2010中,编译执行,悲剧了,提示报错,在网上找了一些资料,仔细看了我参考了第一编文章后面的回复,总算编译通过了,过程如下:
至于编译过程会遇到的错误修正总结如下:
1、TLD::bbPoints函数调用的ceil函数强制把参数类型转换为double。
2、vs2010不存在round函数,重新写一个
int round(float f)
{
if ((int)f+0.5>f)
return (int)f;
else
return (int)f + 1;
}
或者把round要改成cvRound。
3、TLD::clusterBB函数中,vs不支持这种动态数组分配。
float L[c-1]; //Level
int nodes[c-1][2];
int belongs[c];
改成指针和动态分配内存
float *L = new float [c-1]; //Level
int **nodes = new int *[c-1];
for(int i = 0; i < 2 ;i ++)
nodes[i] = new int [c-1];
int *belongs = new int [c];
记得在函数末释放分配的内存
delete [] L;
L = NULL;
for (int i = 0; i < 2; ++i)
{
delete [] nodes[i];
nodes[i] = NULL;
}
delete []nodes;
nodes = NULL;
delete [] belongs;
belongs = NULL;
4、调用floor函数的地方,把参数强制类型转换为double
把所有错误按上面说的方法做修改后,保存编译,OK整个过程完成了。
本文相关的工程文件和源码上传到了CSDN的下载区,大家可以到此下载:
http://download.csdn.net/detail/benshu_001/4934079