matlab和C/C++混合编程--调用opencv
最近的我们已经将整个项目搭起来了,项目比较复杂。由于我们做的是检索系统,所以我们用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 5
Due to the change in the default C++ runtime in OS X 10.9, you probably need to tweak a few configurations in mexopts.sh
to avoid compile issues. If you haven't run mex -setup
in Matlab, please do so first and edit mexopts.sh
and change a few variables. Following shows an example.
上面这段话是原封不动的复制与粘贴,然后他给出的办法是修改/Applications/matlab/MATLAB_R2012a.app/bin/mexopts.sh文件(这段路径是我自己的),如何修改这个文件,他给出了一个办法,但是这里我的修改略和他不同,请注意。首先打开mexopts.sh文件,并且找到maci64,如图:
然后将里面的一些变量如下修改(图中的是已经修改过的):
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方法转到我的博客中。
- 去Opencv官网下载 OpenCV for Windows(我的版本是opencv2.4.10)。
- 将 OpenCV-2.4.4.exe 解压并放到某个目录下,例如E:\opencv\opencv (本人的解压目录)。解压后的目录结构如下图。
3. 右键单击我的电脑→属性→高级→环境变量。
4. 选中PATH,单击编辑。在PATH的末尾添加以下路径:E:\opencv\opencv\build\x86\vc10\bin
。
5. 新建用户变量,单击新建,在弹出的对话框中,将变量名和变量值分别设置为OpenCV和E:\opencv\opencv\build。
6. 设置环境变量完毕,重启电脑,将会生效。
上面配置好了系统环境,下面要对vs2010进行配置:
1、打开VS2010,新建项目→win32控制台项目→附加选项选择空项目→完成。
2、左侧打开工程属性页
3、修改可执行文件目录、包含目录与库目录,分别添加对应的路径。
对应的路径如下:
1)可执行文件目录
E:\opencv\opencv\build\x86\vc10\bin
2)包含目录
E:\opencv\opencv\build\include
E:\opencv\opencv\build\include\opencv
E:\opencv\opencv\build\include\opencv2
3)库目录
E:\opencv\opencv\build\x86\vc10\lib
4、附加依赖项单击“链接器”→“输入”→“附加依赖项”,如下图所示。
opencv_calib3d2410.lib
opencv_calib3d2410d.lib
opencv_contrib2410.lib
opencv_contrib2410d.lib
opencv_core2410.lib
opencv_core2410d.lib
opencv_features2d2410.lib
opencv_features2d2410d.lib
opencv_flann2410.lib
opencv_flann2410d.lib
opencv_gpu2410.lib
opencv_gpu2410d.lib
opencv_highgui2410.lib
opencv_highgui2410d.lib
opencv_imgproc2410.lib
opencv_imgproc2410d.lib
opencv_legacy2410.lib
opencv_legacy2410d.lib
opencv_ml2410.lib
opencv_ml2410d.lib
opencv_nonfree2410.lib
opencv_nonfree2410d.lib
opencv_objdetect2410.lib
opencv_objdetect2410d.lib
opencv_ocl2410.lib
opencv_ocl2410d.lib
opencv_photo2410.lib
opencv_photo2410d.lib
opencv_stitching2410.lib
opencv_stitching2410d.lib
opencv_superres2410.lib
opencv_superres2410d.lib
opencv_ts2410.lib
opencv_ts2410d.lib
opencv_video2410.lib
opencv_video2410d.lib
opencv_videostab2410.lib
opencv_videostab2410d.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
matlab和C/C++混合编程--调用opencv的更多相关文章
- Matlab.NET混合编程调用Figure窗体
原文:[原创]Matlab.NET混合编程调用Figure窗体 1.前言 做Matlab.NET混合编程好几年了,虽然Matlab很多函数忘记得差不多了,但基本的东西还是能熟练使用.特别是在C#调用M ...
- 【5.1送礼】国内第一部Matlab和C#.Net混合编程视频教程【免费】
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 上一次写博客很久了 ...
- matlab和C/C++混合编程--Mex
最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...
- matlab和C/C++混合编程--Mex (六)参数传递
最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...
- matlab和C/C++混合编程--Mex (转载)
matlab和C/C++混合编程--Mex 最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续 ...
- vs2010 matlab混合编程调用matlab引擎
// matlab_engine.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "engine.h" ...
- MATLAB与C/C++混合编程的一些总结
[转载请注明出处]http://www.cnblogs.com/mashiqi 先上总结: 由于C/C++语言的函数输入输出参数的特点,可以将多个参数方便地传入一个函数中,但却不能方便地返回多个参数. ...
- Matlab和C语言混合编程,包含目录的设定
如果.c文件不依赖于任何第三方库,那么mex编译很简单,只需要在matlab的命令行输入 mex test.c 即可. 但是如果这个c文件使用了第三方库文件,如opencv.gsl等等,那么就需要更改 ...
- Matlab 2013a 和 VS2010 混合编程
最近由于项目需求,某项目的算法是基于MATLAB完成的,在短时间内需要去调用算法功能.因此,基于MATLAB生成DLL, C 调用的方式完成. 环境:MATLAB 2013a + VS2010 + w ...
随机推荐
- Android之Activity启动模式
正常模式 每个应用都有一个任务栈,任务栈中保存着已创建的Activity,先创建的Activity先入栈,栈顶是当前正在显示的activity(running),这是正常模式下的Activity的管理 ...
- 【jQuery EasyUI系列】创建CRUD数据网格
在上一篇中我们使用对话框组件创建了CRUD应用创建和编辑用户信息.本篇我们来创建一个CRUD数据网格DataGrid 步骤1,在HTML标签中定义数据网格(DataGrid) <table id ...
- linux 系统下 android studio 获取SHA1
百度地图申请key的时候需要填写包名和SHA1 包名比较好找可以在 AndroidManifest.xml 文件中找到 SHA1的获取方式有两种可以在android studio 下面选择Termin ...
- SSM三大框架(转发)
转自:SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis) 使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基 ...
- MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过 ButtonBase 触发命令
介绍背水一战 Windows 10 之 MVVM(Model-View-ViewModel) 通过 Binding 或 x:Bind 结合 Command 实现,通过 ButtonBase 触发命令 ...
- 系统间通信(5)——IO通信模型和JAVA实践 下篇
7.异步IO 上面两篇文章中,我们分别讲解了阻塞式同步IO.非阻塞式同步IO.多路复用IO 这三种IO模型,以及JAVA对于这三种IO模型的支持.重点说明了IO模型是由操作系统提供支持,且这三种IO模 ...
- 【USACO 1.3】Combination Lock
/* TASK:combo LANG:C++ URL:http://train.usaco.org/usacoprob2?a=E6RZnAhV9zn&S=combo SOLVE:自己做,想的是 ...
- C++11特性:auto关键字
前言 本文的内容已经不新鲜了.关于auto,翻来覆去被人知道的都是这些东西,本文并没有提出新颖的auto用法. 本人原是痛恨博客一篇篇都是copy而来缺乏新意的探索,当然,本文不是copy而来,但发布 ...
- IOS URL 编码和解码
1.url编码 ios中http请求遇到汉字的时候,需要转化成UTF-8,用到的方法是: NSString * encodingString = [urlString stringByAddingPe ...
- lottery概率问题
问题:1~n编号的彩票,要买全,等概率条件下平均要买几张要求写出算法. 回答:已经买了m张时,买中剩下的概率为1-m/n,则要买的张数为1/(1-m/n)n=2,s=1+1/(1-1/2);n=3,s ...