我是做视频目标跟踪的, 最近在调试算法DSST的代码(matalab)时,第一次遇到了 matalab vs opencv混编的情况,在此我把调试的过程中遇到的问题做一下记录!(虽然最终还是没有调试成功)
一 遇到的问题和解决的办法
DSST是matalab程序,但是同时也包含有.cpp和.hpp文件,而在这俩c++程序中同时也调用了opencv库,我下载完整 的程序,是作者已经整理好的程序,就是说只要下载了这个程序就可以直接用,前提是电脑得是64位的,而我的电脑 不巧是32位的,所以程序不能运行。在经过查阅资料后发现
在红色框内的是gradientMex.cpp和mexResize.cpp两个.cpp文件,而mexw64是在matalab中编译.cpp生成的,而mexa64是在lniux环境下编译生成的文件,我需要的是matalab生成的文件,则mexa64文件我是不需要的,我只需要mexw文件,但是这些文件都是64位的,在我32位的电脑中是不能运行的。所以,当前我需要做的是对这两个.cpp文件重新编译,生成32位的相应文件。
二 具体步骤
1 因为是c/c++程序、matalab、opencv混编,所以vs 和opencv是必不可少的(ps:我的vs2012 opencv2.4.9、matalab2010),opencv的配置我就不多说了,网上资料多的是。说正题:
(1)在matalab的command window中输入mex -setup,显示Would you like mex to locate installed compilers [y]/n? 输入y,如下图所示:
这时会发现编译器只有【1】[1] Lcc-win32 C 2.4.1 in D:\MATALA~1\sys\lcc ,而没有vs编译器,经我查阅资料后,推荐使用vs的编译器,但是我的matalab并没有和vs关联上,该怎么办?解决的办法有两个 a:找到关联所需要的文件,添加到matalab中,针对vs2012、vs2013我已经上传了这些文件并配有说明 点击打开链接,b:下载高版本的matalab, matalab的版本最好比vs的版本高一级(ps:也可以参考http://blog.csdn.net/macong01/article/details/41356081)
(2)按(1)操作完后,就可以在matalab中找到vs的编译器了,重新mex -setup,如下图所示:选取相应编译器前的标号,例如我使用的是3。
(3)经过(1)(2)后,就可以把环境配置好了,就可以进行编译了
2 编译的过程
(1)要想在matalab中调用c/c++程序,则在写.cpp文件时,必须得按照符合matalab的编程方式(mexfunction)进行改变,这里多的也就不多说了,网上资料也很多。
(2)新建.cpp文件(可以建个.txt文件,然后把后缀改成.cpp),把程序按照matalab的编程方式进行改写。改好后,在matalab中打开并进行编译,在当前目录下进行编译,写这篇文档的时候我是刚开始接触matalab,所以一直不明白当前目录是什么意思,直到出现如下错误:
然后选中rectifyImageE.cpp右击,点open selection,会提示
然后点是,此时matalab会创建该文档,很长时间我才明白这个文档的位置才是当前目录,所以把之前的程序拷贝到这个文件中(ps:我是matalab菜鸟,这个问题或许还有其他解决办法),若是不包含opencv库,则在此时编译完后,会已经生成mexw的文件,把该文件和源文件同时放到matalab项目中,就可以运行了。但是如果
程序中包含上了opencv库,则在mex时,是需要把opencv的路径也包含上,例如:
mex OpenCVShowImage.cpp -IF:\3rdlibs\OpenCV\include -LF:\3rdlibs\OpenCV\lib -lopencv_core244 -lopencv_imgproc244 -lopencv_highgui244
其中OpenCVShowImage.cpp是项目名,-I -L -l 后面的代表的是opencv库的路径(根据自己的位置改写),
其中-IF:\3rdlibs\OpenCV\include,告诉编译器可以在F:\3rdlibs\OpenCV\include这个目录进行头文件的查找;
-LF:\3rdlibs\OpenCV\lib,告诉链接器可以在F:\3rdlibs\OpenCV\lib这个目录进行库文件的查找;最后三个参数表面我们写的源代码需要链接opencv_core249、opencv_imgproc249和opencv_highgui249这三个OpenCV的静态库。
经过上述操作后,当前目录下同样会生成mexw文件。所有的工作也就完成了
上述文档是根据自己的理解写的,如若有不当之处还请指正!