Matlab与C/C++混合编程调用OpenCV

转载 2013年11月26日 09:14:08

   好久没写博客了,今天一个师兄问到了一个关于在Matlab与C/C++混合编程时,使用OpenCV库的编译问题,所以借此机会总结成文字分享一下过程。

      在使用Matlab编译包含OpenCV库的代码之前,首先假设下面的几项工作已经完成。

      1)下载并解压某个版本的OpenCV至硬盘的某个目录上,并将其运行时库添加到环境变量中。


      2)安装了某个版本的VC编译器,并使用Matlab的mex -setup命令,选择该版本的编译器作为默认编译器。


      3)编写好包含OpenCV库的Matlab与C/C++混合编程代码。

  1. #include <iostream>  
  2. #include <string>  
  3.   
  4. #include <opencv/cv.h>  
  5. #include <opencv/highgui.h>  
  6.   
  7. #include "mex.h"  
  8.   
  9. // Matlab entry point function  
  10. void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[] )  
  11. {  
  12.     // Check if the input argument is legal  
  13.     if ( nrhs != 1 || !mxIsChar( prhs[0] ) )  
  14.     {  
  15.         mexErrMsgTxt("An image name should be given.\n");  
  16.     }  
  17.       
  18.     // Get the name of the image  
  19.     int nStringLen;  
  20.     nStringLen = mxGetNumberOfElements(prhs[0]);  
  21.     std::string szImageName;  
  22.     szImageName.resize( nStringLen + 1 );  
  23.       
  24.     mxGetString( prhs[0], &szImageName[0], nStringLen + 1 );  
  25.       
  26.     // Read the image from file  
  27.     cv::Mat image;  
  28.     image = cv::imread( szImageName );  
  29.       
  30.     // Show the image if it is successfully read from disk  
  31.     if ( !image.empty() )  
  32.     {  
  33.         cv::imshow( "Test Mex OpenCV", image );  
  34.     }  
  35.     else  
  36.     {  
  37.         mexErrMsgTxt("The specified image does not exist.\n");  
  38.     }  
  39. }  

      在做好以上的准备工作之后,就可以开始进行代码的编译了。编译代码时仍然是在Matlab命令行下使用mex命令进行编译,不过不同的是需要在编译时指明OpenCV的头文件、静态库文件所在的目录,以及需要链接的OpenCV库的名称。这个部分与在Linux下面使用gcc或者g++进行代码编译是类似的,下面以目前最新的OpenCV 2.4.4库为例子,展示一下如何编写编译选项的参数,假设上面的代码存放在名为OpenCVShowImage.cpp的源文件中。在Matlab的Command Line窗口中,我们可以输入以下参数来进行上面代码的编译。

[plain] view plaincopy
  1. mex OpenCVShowImage.cpp -IF:\3rdlibs\OpenCV\include -LF:\3rdlibs\OpenCV\lib -lopencv_core244 -lopencv_imgproc244 -lopencv_highgui244  

      其中-IF:\3rdlibs\OpenCV\include,告诉编译器可以在F:\3rdlibs\OpenCV\include这个目录进行头文件的查找;-LF:\3rdlibs\OpenCV\lib,告诉链接器可以在F:\3rdlibs\OpenCV\lib这个目录进行库文件的查找;最后三个参数表面我们写的源代码需要链接opencv_core244、opencv_imgproc244和opencv_highgui244这三个OpenCV的静态库。

      在执行完毕上面的命令之后,当前目录下面就会生成一个OpenCVShowImage.mexw64(或32)的文件,具体的文件名由操作系统是64位还是32位来决定。需要注意的是,如果当前的操作系统是64位的,则在环境变量F:\3rdlibs\OpenCV\bin中以及库文件目录F:\3rdlibs\OpenCV\lib中,必须放置的也是64位版本的OpenCV动态库和静态库。最后便可以使用OpenCVShowImage这个函数了,下面是运行这个函数的结果。


      如此一来整个编译过程便结束了,下面也顺便列一下mex相关编译选项的含义。

      -Ipathname

      Add pathname to the list of folders tosearch for #include files.

      Do not add a space after this switch.

      -lname

      Link with object library. On Windows systems, name expands to name.lib or libname.lib and on UNIX systems, tolibname.so or libname.dylib.

      Do not add a space after this switch.

      -Lfolder

      Add folder to the list of folders to searchfor libraries specified with the -l option. On UNIX systems, you must also setthe run-time library path, as explained in Setting Run-Time Library Path.

      最后也顺便提及一下,在日本有个学生也自己封装一个Matlab版本的OpenCV库,相关的资料可以在http://www.cs.stonybrook.edu/~kyamagu/mexopencv/这个地方看到。

C/C++与Matlab混合编程初探

Matlab 拥有丰富的功能,编程简单。不过,有些情况下,Matlab程序的执行速度比较慢。C/C++编译执行的程序速度比较快,编程难度上比Matlab要高一些。因此存在一种方案,就是使用Matlab...
  • bendanban
  • bendanban
  • 2014年07月15日 21:42
  • 27452

Matlab与C/C++混合编程之Matlab调用OpenCV库函数

研究计算机视觉的同学们对OpenCV和Matlab应该非常熟悉,OpenCV作为最大的计算机视觉开源库已经得到了非常广泛的使用,在视觉研究领域的地位不可动摇,其主要是基于C/C++实现的,主要的开发平...
  • zy122121cs
  • zy122121cs
  • 2016年04月06日 16:16
  • 2662

Matlab与C++混合编程(依赖OpenCV)

Matlab与C++混合编程(依赖OpenCV)zouxy09@qq.comhttp://blog.csdn.net/zouxy09        之前在运行别人论文的代码的时候,经常有遇到Matla...
  • zouxy09
  • zouxy09
  • 2014年03月05日 16:20
  • 46955

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

matlab 与外部程序的编程接口两大类:                一是 如何在matlab里调用其他语言写的代码。 (见例子:使用C-MEX技术,ActiveX技术)             ...
  • fonjames
  • fonjames
  • 2016年06月01日 15:37
  • 5890

MATLAB与C/C++混合编程之MATLAB调用C程序

通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度。Matlab本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或Watcom C中的一种。如果你在安装Matlab时...
  • sbtdkj1017
  • sbtdkj1017
  • 2007年11月25日 15:28
  • 33161

matlab和c++混合编程---方法和步骤

摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序设计语言,两者互补结合的混合编程在科学研究和工程实践中具有非常重要的意义。从Matlab调用C/C++代码及C/C...
  • yimiyangguang185
  • yimiyangguang185
  • 2016年09月22日 19:38
  • 4818

Matlab 和 C/C++混合编程

说明: 这篇博文是对下面两边博文进行总结和整理,以及补充。 blog: http://blog.csdn.net/jtop0/article/details/7657227 http://blog....
  • Work_Hard_SB
  • Work_Hard_SB
  • 2015年01月09日 20:38
  • 3644

Matlab和C混合编程的一个靠谱思路

Matlab和C混合编程的一个靠谱思路写在前面的话 (1)如无特殊需要(如速度),尽量不要做A语言和B语言互相转化这样的事情。 (2)如无特殊需要(如封装),尽量不要做A、B两种语言互相调用...
  • huiyuanliyan
  • huiyuanliyan
  • 2016年06月28日 10:14
  • 2796

vs2013中使用matlab2014b引擎实现c++和matlab混合编程

在Visual C++ 2013 工程中使用 Matlab2014b 提供的图形引擎进行绘图的详细过程。 在编程过程中有时候会遇到在c++中调用matlab,由于matlab强大的图像处理能力和科学...
  • Ghan_
  • Ghan_
  • 2016年11月18日 20:03
  • 1287

精通Matlab与C/C++混合程序设计(第2版) pdf

内容简介     本书主要介绍如何运用Matlab与C/C++进行混合程序设计。共分8章,主要包括: Matlab程序设计初步、Matlab编译器、Matlab与C语言的接口、生成可独立运行的Ma...
  • begtostudy
  • begtostudy
  • 2010年09月16日 16:22
  • 4556
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Matlab与C/C++混合编程调用OpenCV
举报原因:
原因补充:

(最多只允许输入30个字)