Matlab调用cpp+第三方库

问题描述:
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中那个函数了。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab的.m文件转换为可调用的C++库有多种方法。以下是一种常见的方法: 首先,将Matlab的.m文件转换为C++语言。可以使用Matlab提供的嵌入式功能来生成C代码。在Matlab命令行下,可以使用`codegen`函数将.m文件转换为C代码。例如,如果我们有一个名为`myfunc.m`的Matlab函数文件,可以使用以下命令将其转换为C代码: ```matlab codegen myfunc.m -config:lib -args {input_arg1, ... , input_argn} ``` 其中`input_arg1, ... , input_argn`是该函数的输入参数。转换完成后,将会生成一个名为`myfunc`的文件夹,其中包含了C代码的相关文件。 接下来,创建一个用C++编写的接口函数,使得C++代码能够调用C代码。这个接口函数将充当C代码和C++代码之间的桥梁。在C++代码中,可以使用外部关键字`extern`来声明C代码中的函数。然后,在这个接口函数中,可以将C++的数据类型转换为C的数据类型,并调用C代码中相应的函数。 最后,将C++代码编译成一个库文件,以便其他C++程序可以调用。可以使用C++编译器(如g++)将C++代码编译为动态链接库(.dll)或静态库(.lib)。编译的命令可能会有所不同,具体取决于所使用编译器。编译完成后,将会生成一个库文件,可以在其他C++程序中使用。 综上所述,将Matlab的.m文件转换为可调用的C++库的过程包括将.m文件转换为C代码,编写C++接口函数,并将C++代码编译为库文件。通过这个过程,用户可以在C++环境中使用原本只能在Matlab环境中运行的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值