一般在實現圖像處理的算法時咱們使用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++程序)點擊下載