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 -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 -lopencv_core.2.4.9 -lopencv_imgproc.2.4.9 最后这三个是将用到的库链接起来。

最后就会生成如图的bofGabor.mexmaci64文件了~~~



Windows

在Windows下其实和macOS下类似,只是少了修改那个mexopts.sh文件的步骤,今晚太晚了,明天继续写~

时间: 2024-10-15 16:36:28

matlab和C/C++混合编程--调用opencv的相关文章

Matlab.NET混合编程调用Figure窗体

原文:[原创]Matlab.NET混合编程调用Figure窗体 1.前言 做Matlab.NET混合编程好几年了,虽然Matlab很多函数忘记得差不多了,但基本的东西还是能熟练使用.特别是在C#调用Matlab函数这方面,积累了比较多的经验,和使用经验密切相关.根据很多朋友经常遇到的WinForm窗体混编调用Matlab的Figure的问题,花了一些功夫,把这个封装为C#控件,使得大家可以很容易调用Matlab的Figure了. 2.Matlab.NET混合编程概述 这方面就不仔细阐述了,主要是

【5.1送礼】国内第一部Matlab和C#.Net混合编程入门级视频教程【完全免费】

上一次写博客很久了,一直在忙彩票分析系统架构的事情,写博客真是件费神的事情,非常花时间.今天抽空发布这篇博客,是为了开源一部自己录制的视频教程-Matlab和C#.Net混合编程视频教程[入门级].下面说说这部视频教程的来由和一些事情,想获取的仔细看看,别忘了点[推荐]哦! 一.为啥要开源 1.1 视频的来源 这部视频教程是在2012年年底闲时比较多,当初也是很多朋友,网友提出这个Matlab.Net混合编程入门比较难,没有资料,所有就特意录制了一部比较简单的视频教程.并有条件的对广大网友免费开

matlab和C/C++混合编程--Mex

最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我们会重点关注混合编程中最难解决数据的问题--结构到底如何转换,并且后面会重点说一下自己的程序. 一.Mex的结构 先看一个简单的程序(该程序保存在matlab主目录下名字是mexDemon.cpp,或者在主目录下新建一个.cpp文件): #include "mex.h" //加入头文件,该

MATLAB与C/C++混合编程的一些总结

[转载请注明出处]http://www.cnblogs.com/mashiqi 先上总结: 由于C/C++语言的函数输入输出参数的特点,可以将多个参数方便地传入一个函数中,但却不能方便地返回多个参数.要返回多个参数,就得用指针或者struct/class(其他的高招?).但这些麻烦的地方在C程序的函数与函数之间是没有太大问题的,关键是不要在C与MATLAB的接口之处搞的太复杂. 但是,我们在写MATLAB代码的时候,由于变量的格式非常自由,所以我们往往都尽量把变量的格式设计成很comprehen

[Matlab] matlab与C/C++混合编程汇总

matlab 与外部程序的编程接口两大类: 一是 如何在matlab里调用其他语言写的代码. (见例子:使用C-MEX技术,ActiveX技术) 二是 如何在其他语言里调用matlab. (见 使用matlab引擎, MAT数据交换, matlab发布com组件, DeployTool) matlab接口技术包含以下几个方面: 1. 数据导入导出,主要是MAT文件数据的导入导出. 2.普通的动态链接库dll文件的交互,Matlab6.5起,直接matlab环境中调用dll文件导出的函数. 3.m

Matlab和C语言混合编程,包含目录的设定

如果.c文件不依赖于任何第三方库,那么mex编译很简单,只需要在matlab的命令行输入 mex test.c 即可. 但是如果这个c文件使用了第三方库文件,如opencv.gsl等等,那么就需要更改一下mex的编译选项,否则会报fetal error C1083,找不到包括文件. 这里需要注意的是,在mex之前,需要使用 mex -setup 选择编译器,假如我选的是VS2012,那么我需要把相应的选项加到VS2012所对应的opt文件中,具体的位置在 ‘MATLAB路径\R2013a\bin

Matlab 2013a 和 VS2010 混合编程

最近由于项目需求,某项目的算法是基于MATLAB完成的,在短时间内需要去调用算法功能.因此,基于MATLAB生成DLL, C 调用的方式完成. 环境:MATLAB 2013a + VS2010 + win8.1 + 64位系统 一.MATLAB 编译环境设置 1. 安装,MATLAB安装时选择 force 32bit, 这样生成的dll在32位和64位的机器上都可以调用. 2. 装好MATLAB 2013后,打开软件,进行配置 1 >> mex -setup 2 Welcome to mex

【新年送礼】国内第一部C#.Net调用Matlab进行混合编程的视频教程【彻底免费无注册码】

其他混合编程文章 1[原创]Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码) 2.[原创]Matlab.NET混合编程技巧之——找出Matlab内置函数 3.[原创]Matlab与.NET混编解决人脸识别问题 4.[原创]Matlab与.NET基于类型安全的接口编程入门 5.[原创分享]Matlab.NET混编调用Figure窗体 一.视频说明 2014年的5.1,我将这套视频教程进行了免费下载,免费注册开放:[5.1送礼]国内第一部Matlab和C#.Net混合编程

Matlab与.NET混合编程解决人脸识别问题

原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html [原创]Matlab与.NET基于类型安全的接口编程入门 http://www.cnblogs.com/asxinyu/archive/2013/05/16/3082299.ht