Matlab调用C程序心得 from http://hi.baidu.com/bittnt/item/c8f51b200daee5cba5275a97
问题描述: Matlab调用CPP不新鲜,无非就是把写好的c语言编译成mex,然后直接调用呗。很多帖子和书都有描述。具体可以参考附录。这里描述的是如何用Matlab调用Opencv库支持的cpp函数。 解决方法: 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中那个函数了。 tips: 1、报错问题:这个不是有效的win32程序。 解决方案:在vs中编译源文件,64位的matlab需要编译成64位的obj文件;32位的matlab需要编译成32位的obj文件。 2、报错问题:找不到指定的模块。 解决方案:重新编译release和debug版本的opencv,然后编译完后记得在install下面继续编译即安装,然后再次编译你的程序就ok了。 Copyright@Shuai Zheng in baidu hi.2010 |
|