Matlab、C++混合编程调用OpenCV

时间:2022-09-22 09:16:20

1.预热

首先本文是基于Windows平台进行说明,默认读者已经搭配好OpenCV环境的,需要强调的是需要将OpenCV的可执行bin目录加入到系统环境变量Path里面,如下图所示。
Matlab、C++混合编程调用OpenCV
这是在我机器上的路径

D:\opencv2.4.10\opencv\build\x86\vc10\bin;

从路径上也可以看出,我是用的是OpenCV2.4.10版本进行说明。
不过这个因人而异了,无关紧要。
继续!!!

2.Matlab说明

仍然使用mex filename.cpp 来进行编译。

不同的是本次编译需要使用到opencv的类库,因此需要按照相关参数说明,在编译的同时指出关联资源的位置。
接下来对mex编译参数进行说明。

友情提示:help mex 来获取帮助。

>> help mex
......
-I<pathname> //#include包含的头文件所在目录
Add <pathname> to the list of directories to search for #include files. Do not add a space after this switch.

-l<name> //lib类库目录
Link with object library. On Windows, <name> expands to "<name>.lib" or "lib<name>.lib". On Linux, to "lib<name>.so".On Mac, to "lib<name>.dylib". Do not add a space after this switch.

-L<folder>//规定在指定文件夹里搜索以上文件(lib,#include)
Add <folder> to the list of folders to search for libraries specified with the -l option. Do not add a space after this switch.
......

For more information, see
http://www.mathworks.com/help/matlab/ref/mex.html

贴出代码

新建 OpenCVShowImage.cpp文件

#include <iostream>
#include <string>

#include <opencv/cv.h>
#include <opencv/highgui.h>

#include "mex.h"

// Matlab entry point function
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[] )
{
// Check if the input argument is legal
if ( nrhs != 1 || !mxIsChar( prhs[0] ) )
{
mexErrMsgTxt("An image name should be given.\n");
}

// Get the name of the image
int nStringLen;
nStringLen = mxGetNumberOfElements(prhs[0]);
std::string szImageName;
szImageName.resize( nStringLen + 1 );

mxGetString( prhs[0], &szImageName[0], nStringLen + 1 );

// Read the image from file
cv::Mat image;
image = cv::imread( szImageName );

// Show the image if it is successfully read from disk
if ( !image.empty() )
{
cv::imshow( "Test Mex OpenCV", image );
}
else
{
mexErrMsgTxt("The specified image does not exist.\n");
}
}

在Command Whindow中键入如下命令:

mex OpenCVShowImage.cpp -ID:\opencv2.4.10\opencv\build\include -LD:\opencv2.4.10\opencv\build\x86\vc10\lib -lopencv_core2410 -lopencv_imgproc2410 -lopencv_highgui2410

如果顺利编译,会返回编译成功信息。
Building with ‘Microsoft Visual C++ 2010 Professional’.
MEX completed successfully.
Matlab、C++混合编程调用OpenCV

同时,也会产生一个OpenCVShowImage.mexw32文件,如果是64位系统,那么对应是OpenCVShowImage.mexw64文件。
Matlab、C++混合编程调用OpenCV

说明:-I -L -l 这些后面直接跟参数不要有空格

mex OpenCVShowImage.cpp
编译 OpenCVShowImage.cpp

-ID:\opencv2.4.10\opencv\build\include
头文件所在目录

-LD:\opencv2.4.10\opencv\build\x86\vc10\lib -lopencv_core2410 -lopencv_imgproc2410 -lopencv_highgui2410
在指定文件目录里 搜索以上文件 后面三个库文件


有图有真相

Matlab、C++混合编程调用OpenCV


参考文献:zouxy09大神