有很多大牛已经写过OpenTLD在VS中的配置,但是有些细节让我等小弱不甚明白,所以写这篇文章。
OpenTLD在VS2010和OpenCV2.4中的配置,OpenCV2.4是exe版本的,直接解压得到,大小约为2.29G,已经测试过,该方法也可以在OpenCV2.2运行;VS2010安装了SP1,单是在没有SP1版本的情况下依旧可以运行。OpenTLD是AlanTorresC++实现的OpenTLD zip包。
1、下载软件
下载OpenCV-2.4.0,双击解压到C:\OpenCV2.4。
下载VS2010,安装。
2、配置OpenCV环境变量
计算机->(右键)属性->高级系统设置->高级(标签)->环境变量->(双击)path(用户,系统里面的path任选其一)->在变量值里面添加
C:\OpenCV2.4\build\x86\vc10\bin
C:\OpenCV2.4\build\common\tbb\ia32\vc10
3、配置工程的opencv依赖(每次新建工程都要重新配置,要执行此步骤请先跳到第4步建立工程)
1)、项目(菜单项)->…属性->VC++目录:需要配置“包含目录”和“库目录”两项。
2)、配置“包含目录”项:添加以下四行,最后一行是tld中自带的include,也要加进去。
C:\OpenCV2.4\build\include
C:\OpenCV2.4\build\include\opencv
C:\OpenCV2.4\build\include\opencv2
E:\leProjects\tld\tld\include
3)、配置“库目录”项:添加行
C:\OpenCV2.4\build\x86\vc10\lib
4)、配置连接器:项目(菜单项)->…属性->连接器->输入->附加依赖项
针对debug配置添加以下库:
opencv_calib3d240d.lib
opencv_contrib240d.lib
opencv_core240d.lib
opencv_features2d240d.lib
opencv_flann240d.lib
opencv_gpu240d.lib
opencv_highgui240d.lib
opencv_imgproc240d.lib
opencv_legacy240d.lib
opencv_ml240d.lib
opencv_objdetect240d.lib
opencv_ts240d.lib
opencv_video240d.lib
如果是release配置则添加:
opencv_calib3d240.lib
opencv_contrib240.lib
opencv_core240.lib
opencv_features2d240.lib
opencv_flann240.lib
opencv_gpu240.lib
opencv_highgui240.lib
opencv_imgproc240.lib
opencv_legacy240.lib
opencv_ml240.lib
opencv_objdetect240.lib
opencv_ts240.lib
opencv_video240.lib
4、用VS2010新建控制台工程测试:
OpenTLD在VS2010编译运行包括如下步骤:
- 新建空工程(我是vs2010),取名TLD,并将解压缩下include的文件导入到TLD头head file中;并将解压缩下src的文件导入到TLD头sorcefile中。
- round错误;解决办法:改成cvRound;
- 编译成功后,运行,摄像头一直亮着,将run_tld.cpp中的 capture.open(0)注释掉;
- 看了之后,明白了原来运行需要传递参数。见下面cmd命令:
-p parameters.yml -s datasets\01_david\david.mpg -b datasets\01_david\init.txt –tl
- TLD::bbPoints函数调用的ceil和floor函数强制把参数类型转换为double。
- 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];
- 记得在函数末释放分配的内存,有两个return的地方,这两个地方之前需要加上这一段。
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;
注意:第一个视频运行起来貌似有问题,可以改换其他组的视频。
可以做的事情:摆脱opencv的函数库,和加入多线程、directx、cpu增强指令集以及gpu的支持。以提高程序的执行效率。