from http://hi.baidu.com/bittnt/item/c8f51b200daee5cba5275a97
問(wèn)題描述:
Matlab調用CPP不新鮮,無(wú)非就是把寫(xiě)好的c語(yǔ)言編譯成mex,然后直接調用唄。很多帖子和書(shū)都有描述。具體可以參考附錄。這里描述的是如何用Matlab調用Opencv庫支持的cpp函數。
解決方法:
0、當然,你得先設置好起碼的mex -setup,就是指定編譯器,如果在M¥中大家都設成VS2008,VS2005之類(lèi)的吧。
進(jìn)入正題
1、首先打開(kāi)我的Matlab2009b,然后輸入mex -v,可以發(fā)現清單中Options file對應那項,直接選中那個(gè)文件名,在我這里差不多就是C:\Users\bit\AppData\Roaming\MathWorks\MATLAB\R2009b\mexopts.bat這個(gè)文件名,然后右鍵打開(kāi)所謂open selection。
2、進(jìn)入編輯狀態(tài)后,找到所謂PAPTH,INCLUDE,LIB等地方,和在Visual Studio中設置options中那個(gè)VC diectory目錄一樣。
3、然后還得改LINKFLAGS=后面一大堆。如我這里把這個(gè)地方一行加成這樣子
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"
其實(shí)就是和調用Opencv里面設置lib那一大堆文件一樣。
4、這不算完,然后在VS中新建一個(gè)project,選擇建立DLL動(dòng)態(tài)鏈接庫工程,最好都是空的。按照正常方式設置好opencv。然后在source files下添加你的code,比如我這里添加了Wrapper.cpp的程序。往里面填代碼。其具體方式給個(gè)例子:
#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[], // 輸出參數個(gè)數,及輸出參數數組
int nrhs, const mxArray *prhs[]) // 輸入參數個(gè)數,及輸入參數數組
{
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;
}
當然同目錄下還得加入一個(gè)Wrapper.def文件,這個(gè)里面內容最好是如下:
LIBRARY Wrapper
EXPORTS mexFunction
6、這不算完,打開(kāi)Tools->options,然后看到Project and solutions后往下面找VC++ Directories中那個(gè)Excutable files,變更為Include Files,然后添加你的matlab根目錄\extern\include\win32還有include兩個(gè)目錄。此外,添加Library files中根目錄\extern\lib\win32\microsoft。以及在Source files下添加Opencv2.0\Vc2008\src這個(gè)路徑。
跑到Proejct property下面找additional dependencies,在opencv一大堆lib后面繼續添加libmex.lib libmx.lib libmat.lib。
7、編譯這個(gè)文件。然后開(kāi)始debug,不出意外,會(huì )打開(kāi)一個(gè)matlab 2009b的主程序,這樣子后。找到你的vs project下面,然后在命令框輸入mex Wrapper.obj,然后再輸入Wrapper('lena.jpg');,這樣子就可以調用opencv中那個(gè)函數了。
tips:
1、報錯問(wèn)題:這個(gè)不是有效的win32程序。
解決方案:在vs中編譯源文件,64位的matlab需要編譯成64位的obj文件;32位的matlab需要編譯成32位的obj文件。
2、報錯問(wèn)題:找不到指定的模塊。
解決方案:重新編譯release和debug版本的opencv,然后編譯完后記得在install下面繼續編譯即安裝,然后再次編譯你的程序就ok了。
Copyright@Shuai Zheng in baidu hi.2010

