在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近的我们已经将整个项目搭起来了,项目比较复杂。由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然后用c#调用matlab,单单这个配置问题就搞了我们一个多星期,不过还是顺利解决了,解决方法以后有时间再写个博客出来。 虽然我们整个项目已经能在c#下跑通了,但是检索效果真不理想,检查各种可能出现问题的地方,首先自然是特征的问题。我们做的是偏图像的检索,有些现成的特征提取算法是在opencv下实现的,需要借助opencv来实现特征的提取,因此我们要利用matlab来调用opencv。 上次的那个博客已经说了如何用mex来实现混合编程,同样如果c++代码中调用了opencv库的话,用mex编译的时候就不再像之前那么简单。由于手头上有MacOS和Windows两个系统,下面我分别对此讲述如何利用mex编译带opencv调用的c++代码。 首先我用的matlab版本是matlab2012a 64bit,opencv的版本是用homebrew安装的(具体版本忘记了) MacOS 在苹果系统下,我是参考这位同学的工作:http://vision.is.tohoku.ac.jp/~kyamagu/software/mexopencv/,但是由于OS X的环境会和matlab自带的库冲突。In OS X environment, runtime error can happen when the version of your system library conflicts with matlab's internal library. 我的冲突就是DCHAR16_T的重复宏定义,因此我和那篇文章的配置方法略有不同。 OS X 10.9 and XCode 5Due to the change in the default C++ runtime in OS X 10.9, you probably need to tweak a few configurations in 上面这段话是原封不动的复制与粘贴,然后他给出的办法是修改/Applications/matlab/MATLAB_R2012a.app/bin/ 然后将里面的一些变量如下修改(图中的是已经修改过的): CC='clang' CXX='clang++' SDKROOT='/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/' MACOSX_DEPLOYMENT_TARGET='10.9' CLIBS="$CLIBS -lc++" CXXFLAGS="-fno-common -no-cpp-precomp -fexceptions -arch $ARCHS -isysroot $SDKROOT -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET -std=c++11 -stdlib=libc++" #注意这里和他的不同在我删除了-DCHAR16_T,这个东西保留会宏定义冲突 CXXLIBS="$MLIBS -lc++" 这样就配置好MacOS下的编译环境了,然后打开Matlab,在command window下输入mex -setup。按照步骤进行设置mex的编译配置,如图: 但是上面这样只是配置好了编译环境,只能够利用Mex来编译纯C/C++的代码,如果要编译含opencv函数的代码,需要再参照下面这篇博客:http://blog.csdn.net/raodotcong/article/details/8785358。我是这样做的,因为我通过homebrew安装opencv的,安装路径在/usr/local/Cellar/opencv下,所以当我用mex编译是应该如下输入:例如我要编译途中的cpp文件(调用了opencv库的代码): 然后在matlab下输入: mex bofGabor.cpp cvgabor.cpp Image.cpp Retriever.cpp -I/usr/local/Cellar/opencv/2.4.9/include -L/usr/local/Cellar/opencv/2.4.9/lib/ -lopencv_highgui.2.4.9 -lopencv_core.2.4.9 -lopencv_imgproc.2.4.9 稍微解释一下上面的命令, mex bofGabor.cpp cvgabor.cpp Image.cpp Retriever.cpp 是将四个文件链接起来一起生成Mex文件。 -I/usr/local/Cellar/opencv/2.4.9/include 是告诉编译器去哪寻找头文件。 -L/usr/local/Cellar/opencv/2.4.9/lib/ 是告诉编译器去哪寻找库文件 -lopencv_highgui.2.4.9 -lopencv_core.2.4.9 -lopencv_imgproc.2.4.9 最后这三个是将用到的库链接起来。 最后就会生成如图的bofGabor.mexmaci64文件了~~~ Windows 在Windows下其实和macOS下类似,只是少了修改那个mexopts.sh文件的步骤。首先是安装opencv,对于vs2010,我转这篇文章备忘,因为我经常用到这个教程:http://wiki.opencv.org.cn/index.php/VC_2010%E4%B8%8B%E5%AE%89%E8%A3%85OpenCV2.4.4。 下面我就将他的配置Opencv方法转到我的博客中。
3. 右键单击我的电脑→属性→高级→环境变量。 4. 选中PATH,单击编辑。在PATH的末尾添加以下路径: 5. 新建用户变量,单击新建,在弹出的对话框中,将变量名和变量值分别设置为OpenCV和E:\opencv\opencv\build。 6. 设置环境变量完毕,重启电脑,将会生效。
上面配置好了系统环境,下面要对vs2010进行配置: 1、打开VS2010,新建项目→win32控制台项目→附加选项选择空项目→完成。 2、左侧打开工程属性页 3、修改可执行文件目录、包含目录与库目录,分别添加对应的路径。 对应的路径如下: 1)可执行文件目录 2)包含目录
3)库目录
4、附加依赖项单击“链接器”→“输入”→“附加依赖项”,如下图所示。 opencv_calib3d2410.lib 上面就是所有的opencv在vc2010下的配置过程,只是为了备忘。 测试代码: #include <highgui.h> #include <iostream> using namespace cv; void main() { IplImage *src = cvLoadImage("lena.jpg"); //这里将lena.jpg和lena.cpp文件放在同一个文件夹下 cvNamedWindow("lena",CV_WINDOW_AUTOSIZE); cvShowImage("lena",src); cvWaitKey(0); cvDestroyWindow("lena"); cvReleaseImage(&src); }
后面要用matlab编译C++(含opencv调用)的代码的流程和MacOS的一样,也是先Mex -setup设置编译器,然后编译的时候就按照本文红色加粗字那样给出相应路径即可编译成功。 例子: mex bofGabor.cpp cvgabor.cpp Image.cpp Retriever.cpp -IE:\opencv\opencv\build\include\ -LE:\opencv\opencv\build\x86\vc10\lib -lopencv_highgui2410 -lopencv_core2410 -lopencv_imgproc2410
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论