問題描述:
Matlab調用CPP不新鮮,無非就是把寫好的c語言編譯成mex,然後直接調用呗。很多帖子和書都有描述。具體可以參考附錄。這裡描述的是如何用Matlab調用Opencv庫支持的函數。
解決方法:
0、當然,你得先設置好起碼的mex -setup,就是指定編譯器,如果在M¥中大家都設成VS2008,VS2005之類的吧。
進入正題:
1、首先打開我的Matlab2009b,然後輸入mex -v,可以發現清單中Options file對應那項,直接選中那個文件名,在我這裡差不多就是C:/Users/bit/AppData/Roaming/MathWorks /MATLAB/R2009b/mexopts.bat這個文件名,然後右鍵打開所謂open selection。
2、進入編輯狀態後,找到所謂PAPTH,INCLUDE,LIB等地方,和在Visual Studio中設置options中那個VC diectory目錄一樣。
3、然後還得改LINKFLAGS=後面一大堆。如我這裡把這個地方一行加成這樣子
set LINKFLAGS=/dll /export:%ENTRYPOINT% /LIBPATH:"%LIBLOC%" cxcore200d.lib cv200d.lib highgui200d.lib ml200d.lib cvaux200d.lib libmx.lib libmex.lib libmat.lib /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /incremental:NO /implib:"%LIB_NAME%.x" /MAP:"%OUTDIR%%MEX_NAME%%MEX_EXT%.map"
其實就是和調用Opencv裡面設置lib那一大堆文件一樣。
4、這不算完,然後在VS中新建一個project,選擇建立DLL動態鏈接庫工程,最好都是空的。按照正常方式設置好opencv。然後在source files下添加你的code,比如我這裡添加了Wrapper.cpp的程序。往裡面填代碼。其具體方式給個例子:
#include "mex.h"
#include <cv.h>
#include <highgui.h>
#include <cvaux.h>
#include <cxcore.h>
#include <ml.h>
using namespace cv;
void mexFunction (int nlhs, mxArray *plhs[], // 輸出參數個數,及輸出參數數組
int nrhs, const mxArray *prhs[]) // 輸入參數個數,及輸入參數數組
{
int m, n;
double *params, *des, *loc;
char name[256];
int buflens = mxGetNumberOfElements(prhs[0]);
mxGetString(prhs[0], name, buflens+1);
params = mxGetPr(prhs[1]);
loc = mxGetPr(prhs[2]);
m = mxGetM(prhs[2]);
n = mxGetN(prhs[2]);
if (mxGetM(prhs[1]) != 9 || mxGetN(prhs[1]) != 1)
{
mexErrMsgTxt("Error in parameter/n");
}
if (m <= 0 || n != 2)
{
mexErrMsgTxt("Error in location/n");
}
if (!mxIsChar(prhs[0]))
{
mexErrMsgTxt("First parameter must be string/n");
}
//mexPrintf(name);
IplImage * img = cvLoadImage(name, 1);
Mat mat(img);
//Mat mat = imread(name, 1);
if (mat.data == NULL)
{
mexErrMsgTxt("Error in image/n");
}
NamedWindows("1",1);
imshow("1",mat);
WaitKey(0);
return;
}
當然同目錄下還得加入一個Wrapper.def文件,這個裡面內容最好是如下:
LIBRARY Wrapper
EXPORTS mexFunction
6、這不算完,打開Tools->options,然後看到Project and solutions後往下面找VC++ Directories中那個Excutable files,變更為Include Files,然後添加你的matlab根目錄/extern/include/win32還有include兩個目錄。此外,添加Library files中根目錄/extern/lib/win32/microsoft。以及在Source files下添加Opencv2.0/Vc2008/src這個路徑。
跑到Proejct property下面找additional dependencies,在opencv一大堆lib後面繼續添加libmex.lib libmx.lib libmat.lib。
7、編譯這個文件。然後開始debug,不出意外,會打開一個matlab 2009b的主程序,這樣子後。找到你的vs project下面,然後在命令框輸入mex Wrapper.obj,然後再輸入Wrapper('lena.jpg');,這樣子就可以調用opencv中那個函數了。
Ubuntu Server上安裝Matlab http://www.linuxidc.com/Linux/2014-09/106242.htm
Matlab與C/C++聯合編程之從Matlab調用C/C++代碼 http://www.linuxidc.com/Linux/2012-08/68148.htm
二分類SVM方法Matlab實現 http://www.linuxidc.com/Linux/2013-05/84050.htm
Matlab中的取整函數fix, floor, ceil與round http://www.linuxidc.com/Linux/2013-10/91161.htm
Matlab編譯cuda的.cu文件 http://www.linuxidc.com/Linux/2014-04/100675.htm
Linux Matlab服務器進一步改造成Application Server(應用程序服務器) http://www.linuxidc.com/Linux/2014-09/106340.htm