VS与Matlab混合编程, 调用Opencv环境配置 以及相关说明

时间:2024-05-23 19:41:27

网上看了很多C++调用Matlab DLL文件的混合编程资料,都不是很全,特别是需要调用Opencv时,会遇到各种问题,需要很久才能解决,归根结底就是环境配置的问题。因此,现在写一个详细的步骤,希望给能看到的人一点帮助。

我的工作环境是Win10系统,Matlab64位,VS2010。  下面的配置工作会针对不同环境详细说明。

1、需要将编好的Matlab封装成一个函数,在函数中是可以用load等语句导入数据的,后续只需将load的文件一起打包即可。

2、将编好的Matlab函数,编译生成DLL文件。具体方法网上有很多,如:http://blog.****.net/scudz/article/details/13628917

3. 将生成的.dll,.h,.lib 三个文件以及需要导入的MATLAB数据文件(如.mat)一起放在C++工程文件下

4. 配置工程环境。

这一步是最麻烦的,如果环境没配置好,会出各种问题。  首先需要说明的是vs环境下,调用Matlab DLL需要工作在Release模式下,同时编译环境是X86还是X64需要根据你的Matlab的版本确定。如我的是Matlab 64位,因此生成的DLL是64位编码的,所以VS的环境应设置为X64。

这一步很重要,下面的配置都是基于编译环境配置的。


首先确认将Matlab的路径和Opencv的路径添加到环境变量中。

因为VS的工作环境是X64,因此添加到环境变量中的路径需要是64位的路径。 添加路径时根据自己软件的安装位置为准。

MATLAB:

D:\Program Files\MATLAB\R2015b\bin 
D:\Program Files\MATLAB\R2015b\runtime\win64
D:\Program Files\MATLAB\R2015b\polyspace\bin
Opencv:
D:\Program Files\opencv\build\x64\vc10\bin
如下图
VS与Matlab混合编程, 调用Opencv环境配置 以及相关说明

如果是32位编译环境,添加对应的X86路径即可。


接着,需要配置VS工程环境。

打开项目配置界面,首先添加路径

Matlab:

D:\Program Files\MATLAB\R2015b\extern\include

D:\Program Files\MATLAB\R2015b\extern\include\win64

Opencv:
D:\Program Files\opencv\build\include
D:\Program Files\opencv\build\include\opencv
D:\Program Files\opencv\build\include\opencv2

如果是32位编译环境,将Matlab 添加的路径修改为X86的路径即可。

如下图

VS与Matlab混合编程, 调用Opencv环境配置 以及相关说明

VS与Matlab混合编程, 调用Opencv环境配置 以及相关说明

(此图中Opencv的路径在下面是因为我将Opencv的路径设置成了对所有工程有效的路径,将其路径添加到上面空白处不影响,下同。)


接着配置库文件路径

MATLAB:

D:\Program Files\MATLAB\R2015b\extern\lib\win64\microsoft 
Opencv:
D:\Program Files\opencv\build\x64\vc10\lib 
如果是32位编译环境,修改为X86的路径即可。
如下图
VS与Matlab混合编程, 调用Opencv环境配置 以及相关说明

接着添加外部库:

首先是和Matlab有关的两个

mclmcrrt.lib
mclmcr.lib

然后是你自己编译的Matlab 的.lib 如我的是: libRecognize.lib

同时还有Opencv的lib库,这里有一个重要的问题就是Opencv的lib要和自己的Opencv版本对应,同时因为是在Release模式下,因此其lib文件需要放不带d的,这一点很重要,不能将带d的和不带d的一起放进去,这样运行时会出错

如下图

VS与Matlab混合编程, 调用Opencv环境配置 以及相关说明


配置完工程环境后,要将编译好的.h 头文件导入工程中,注意是导入,只有导入后,在工程的源文件中才能看到你自己的.h文件 (或者将.h文件的路径添加到工程路径也可以)。

在需要用到的地方添加头文件,如#include"libRecognize.h"


到这里VS调用Matlab的环境配置好了,接着就是编代码了。

Matlab生成的.h头文件中,提供了两种调用我们编写的函数的方式。在头文件中,我们可以详细的看到这两个函数的声明,见下图:

VS与Matlab混合编程, 调用Opencv环境配置 以及相关说明VS与Matlab混合编程, 调用Opencv环境配置 以及相关说明


我Matlab编写的函数名字是Recognize,在生成的libRecognize.h头文件中,有两个关于Recognize函数的声明。

一、bool MW_CALL_CONV mlxRecognize(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
二、extern LIB_libRecognize_CPP_API void MW_CALL_CONV Recognize(int nargout, mwArray& R, const mwArray& P);

这两个函数都可以实现我们编写的Matlab函数的功能,mxArray  和 mwArray 是C调用Matlab使用的一种数据类型,第一个是老的版本,第二个是最新的版本,所以第二个更好用,其调用格式更方便。所以一般我们用第二个函数。

关于mwArray的使用可以在网上找到资料,这里不介绍。第二个Recognize函数中,int nargout 是函数的参数个数。

下图是关于mwArray的使用范例:
VS与Matlab混合编程, 调用Opencv环境配置 以及相关说明


到这里就介绍完了,如果觉得有帮助,就给个赞VS与Matlab混合编程, 调用Opencv环境配置 以及相关说明