将matlab的.m文件编译成dll的步骤:
本文只介绍使用deploytool工具编译的方法
- 键入deploytool命令,打开deploytool工具
选择第三个选项“Library Compiler"
左上角选择"C++ Shared Library",旁边”Add exported functions"右边点击加号添加要导出的函数,可以添加多个
添加了.m函数后,最右边的"Package"变为绿色可选状态,点击它就可以生成dll了
2 vs调用方法
本文采用vs2015,dll采用显示调用方式(主要是嫌麻烦,只要一个dll,不用.h和.lib文件。)
- 新建一个调用dll的测试控制台项目
- 包含matlab 与c++的接口sdk
库目录添加:..\MATLAB\R2017a\extern\lib\win64\microsoft
链接器-输入-附加依赖项,添加以下几个lib
mclmcr.lib
mclmcrrt.lib
libmx.lib
libmex.lib
libmat.lib
libeng.lib
测试主函数
用deploytool生成dll时,也会生成.h文件,里面有用到的函数声明
如果要使用某个函数,先调用初始化函数(.h文件里面有它的声明),再调用你的功能函数
具体见下面的测试函数,这个是一个图像处理函数,哈哈
//MeterRecognizeDLL调用测试20180201
//采用mexFunction
void FuncMeterRecognizeDLL(cv::Mat I)
{
HINSTANCE h = LoadLibraryA("MeterRecognizeDLL.dll");
//DLL初始化函数
typedef bool(*pInitialize)(void);//初始化函数
pInitialize Initialize = NULL;
Initialize = (pInitialize)GetProcAddress(h, "MeterRecognizeDLLInitialize");//函数声明在.h文件里面
//MeterRecognizeDLL功能函数
typedef bool(*pmlx)(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);//mlxMeterRecognizeDLL函数声明在.h文件里面
pmlx mlxMeterRecognizeDLL = NULL;
mlxMeterRecognizeDLL = (pmlx)GetProcAddress(h, "mlxMeterRecognizeDLL");
if (!Initialize()) //初始化,必需要有,不要怀疑哦
{
// system("pause");
cout << "Could not initialize" << endl;
exit(0);
}
// I是opencv图像数据结构
mxArray *是matlab c++形式的矩阵指针。
如何转换呢?
先定义一个mxArray *指针
int M = I.rows; //图像的行数
int N = I.cols; //图像的列数
mxArray
* pmxArray = mxCreateDoubleArray(M,N,mxREAL);
double* prmxArray = mxGetPr(pmxArray );
//I.data是opencv图像的头指针,prmxArray是matlab矩阵的头指针,使用memcpy将opencv图像数据复制到matlab矩阵当中
memcpy((double*)I.data,prmxArray
,sizeof(double)*M*N);
mxArray * ptArrayIn0 = cvMat2pMxArrayDouble(I);//输入
mxArray* ptArrayOut0 = mxCreateDoubleMatrix(1, 1, mxREAL);//输出
double *prOut0 = mxGetPr(ptArrayOut0);
*prOut0 = 0;
int nlhs = 1; //左边参数个数,即输出参数个数
mxArray
*plhs[] = { ptArrayOut0 };//输出
int nrhs = 1; //右边参数个数,即输入参数个数
mxArray*prhs[] = { ptArrayIn0 };//输入
mlxMeterRecognizeDLL(nlhs, plhs, nrhs, prhs);// 功能函数
输出结果在plhs中
plhs[0]:mxArray* 类型,第一个输出参数,依次类推,plhs[1],第二个
比如,查看输出结果
double* prOut0 = mxGetPr(plhs[0]);
for (int i=0;i <M*N;i++)
cout<<*prOut0(i++)<<endl;
cv::Mat BW = pMxArrayDouble2cvMat(plhs[0]); //
}
整个过程中,可能会出现一些错误: