一般在实现图像处理的算法时咱们使用Matlab编程,由于它具备丰富的库函数以及操做方便,然而在工程项目中一般使用C/C++语言。若是咱们将matlab代码彻底重写成C++代码会很麻烦,最好的办法是借助matlab与C/C++接口将.m程序转成dll文件!ios
1、使用matlab将.m转成dll文件
一、在命令行中输入mex -setup
提示你是否要在本地安装matlab compilers,而后选择compiler类型,有matlab自带的编辑器以及检测到的其余编辑器,好比“Microsoft Visual C/C++ version 6.0 in E:\Program Files\Microsoft Visual Studio”,根据本身实际状况选择。c++
二、在命令行中输入mbuild -setup
这里的选项和上面相似,依次选择环境肯定。算法
三、生成dll文件
一句命令mcc -W cpplib:add -T link:lib add.m
前面的add
表示生成的dll文件名,后面的add.m
顾名思义是.m文件名。生成后会多出8个文件,有用的是add.ctf
add.dll
add.lib
add.h
4个文件,听说新版的Matlab不会生成.ctf
文件。编程
2、VC6.0中调用生成的dll文件
上面生成的dll文件,咱们能够借助VC6.0的Depends
工具查看导出函数名,可是咱们要调用导出函数必需要知道函数的形参返回类型等,这里要借助.h
文件,它包含了导出函数的声明,下面以实例来说解使用方法:
一、add.m文件编辑器
function [a,b]=add(x,y) a=2*x+y; b=3*y; end
注意了add函数有两个返回值,能够猜想一下在C++中是如何处理的;函数
二、add.h文件
截取其中一段关键代码以下:工具
extern void add(int nargout, mwArray& a, mwArray& b , const mwArray& x, const mwArray& y);
实际上函数的返回是变相的放到形参中的,依次是输出参数个数,输出参数,输入参数。PS 如今作的这个项目中用户自定义算法dll使用的规则和这里相似!ui
三、C++中调用dll文件
(1)新建空工程,将上面说起的4个文件放到工程目录下;
(2)VC++目录中包含目录:matlab 内的include目录
好比个人是 E:\MATLAB7\extern\include
(3)VC++目录中库目录:matlab 内的lib目录E:\MATLAB7\extern\lib\win32\microsoft\msvc60
,要根据VC++版本修改!
(4)工程属性-》链接-》输入-》附加依赖项
输入:add.lib
mclmcrrt.lib
mclmcr.lib
,第一个是生成的。或者在预处理中加入下面代码spa
#pragma comment(lib, "mclmcrrt.lib") #pragma comment(lib, "mclmcr.lib") #pragma comment(lib, "add.lib")
四、C++代码命令行
#include <iostream> #include "add.h" using namespace std; int main() { if(!addInitialize()) { cout<<"initilize failed!!!"<<endl; return -1; } mwArray a(1,1,mxDOUBLE_CLASS); mwArray b(1,1,mxDOUBLE_CLASS); a(1,1)=20; b(1,1)=30; mwArray x(1,1,mxDOUBLE_CLASS); mwArray y(1,1,mxDOUBLE_CLASS); //输出参数个数,输出参数,输入参数。 add(2,x,y,a,b); double *i=new double; double *j=new double ; x.GetData(i,1); y.GetData(j,1); cout<<"x="<<*i<<" y="<<*j<<endl; getchar(); return 0; }
注意:addInitialize()
必定要!
最后附上实现代码(含.m文件和c++程序)点击下载