在Matlab中调用C/C++程序<三>

本文转载自:herohbc


本文介绍如何在Microsoft Visual C++的IDE中生成MEX文件。

当我们的工程特别大,需要调用许多外部库函数时,直接在Matlab的Command Window中运行mex函数就十分的麻烦了。

这时,我们可以使用微软提供的C/C++集成开发环境。

下面将以Visual Studio 2008 SP1为例,编写一个mexFunction函数,通过调用OpenCV中的函数来计算一个方阵的行列式。

1. 配置Visual Studio 2008的开发环境

1.1 新建环境变量Matlab,如下图所示。

 

1.2 打开Visual Studio 2008,Tools -> Options -> Projects and Solutions -> VC++ Directories,选择右端Show directories for:下拉列表中的Include files,添加记录

$(Matlab)\extern\include

$(Matlab)\extern\include\win32

 

1.3 再选择Show directories for:下拉列表中的Library files,添加记录$(Matlab)\extern\lib\win32\microsoft,单击OK按钮。

 

1.4 OpenCV的配置方法可参见我去年的一篇博客http://hi.baidu.com/herohbc/item/d02d09cc3bdcc90ec610b264,我现在使用的OpenCV的版本为2.3.1,但配置方法都一样。也可以参见OpenCV的官方说明。

 

1.5 配置完成后,重启电脑。

 

2. 生成MEX文件

2.1 打开Visual Studio 2008,新建一个Window32 Console Application程序,工程名为det_opencv,Application type设置为Dll,并勾选Empty project,单击Finish。如下图所示。

 

2.2 新建文件det_opencv.cpp,内容如下:

#include <mex.h>
#include <opencv2/core/core.hpp>

 

#ifdef _DEBUG
#pragma comment(lib, "opencv_core231d.lib")
#else
#pragma comment(lib, "opencv_core231.lib")
#endif

 

#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmex.lib")
#pragma comment(lib, "libmat.lib")


void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
 if (nrhs != 1)
 {
  mexErrMsgTxt("One input argument required.");
 }
 
 if (nlhs != 1)
 {
  mexErrMsgTxt("One output argument required.");
 }

 

 int M = mxGetM(prhs[0]);
 if (M != mxGetN(prhs[0]))
 {
  mexErrMsgTxt("Matrix must be square.");
 }

 

 double *p = mxGetPr(prhs[0]);
 cv::Mat A(M, M, CV_64FC1, p);
 double d = cv::determinant(A);
 
 plhs[0] = mxCreateDoubleScalar(d);
}

 

2.3 在Release模式下,打开Project -> det_opencv Properties...,将Linker -> General -> Output File的扩展名由.dll修改为.mexw32。如下图所示。

当然,不修改也可以。但在使用时,Matlab会给出警告信息。

 

2.4 新建文件det_opencv.def,内容如下:

LIBRARY "det_opencv"
EXPORTS mexFunction

 

2.5 在Release模式下编译成功后,det_opencv所在目录下的Release文件夹中会生成一个det_opencv.mexw32文件。这就是我们最终所需要的MEX文件。

 

3. 测试程序

3.1 将det_opencv.mexw32文件复制到Matlab的Current Folder。

 

3.2 在Command Window中输入以下命令:

>> format long
>> A = rand(20,20);
>> d1 = det_opencv(A)

d1 =

  -0.023477632036476

>> d2 = det(A)

d2 =

  -0.023477632036475

 

3.3 det_opencv.mexw32没有任何帮助信息,因此最好建立一个M文件,进行一下简单的封装。例如,新建文件test_det.m,内容如下:

function d = test_det(A)
% Computing the determinant of the square matrix A by invoking function det_opencv

% Just for a test!
% 2012 - 08 - 11

d = det_opencv(A);

 

注意,det_opencv.mexw32和test_det.m要放在同一文件夹中。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值