在Matlab中调用C/C++程序<三>
来源:互联网 发布:北航软件培训中心 编辑:程序博客网 时间:2024/06/06 07:48
本文转载自: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要放在同一文件夹中。
- 在Matlab中调用C/C++程序<三>
- 在C程序中调用Matlab功能
- 在Matlab中调用C语言程序
- MATLAB中调用.C程序
- 在Matlab中调用C/C++程序<一>
- 在Matlab中调用C/C++程序<二>
- 在Matlab中调用C/C++程序<四>
- Matlab调用c程序
- MATLAB调用C程序
- Matlab调用C程序
- matlab调用c程序
- matlab调用C程序
- matlab调用C程序
- matlab调用C程序
- matlab调用C程序
- matlab中调用c/c++程序
- 在c,c++中调用Matlab
- 如何在matlab中调用C
- Shell 显示带颜色字体
- 最快速度找到内存泄漏
- C#提取某一文件加下所有txt中的文件信息
- iOS7新特征汇总[05]初窥UIKit动力(UIKit Dynamics)
- Java安全通信:HTTPS与SSL
- 在Matlab中调用C/C++程序<三>
- 不喜欢的工作,可能通往一个崭新世界
- asp.net MVC上传文件
- java学习多线程中遇到的例子:做饭买盐问题
- 14 lessons after five years of professional programming
- UIApplication类及其委托方法 application:didFinishLaunchingWithOptions:
- 与88后的座谈(一) 人人需要Mentor,世界没有奇迹
- MFC在VS2008中如何手动添加消息映射
- 念茜的博客