MATLAB如何使用动态链接库的形式调用C++
问题描述:使用MATLAB来调用C++写的dll文件,并且调用了外部库的形式,调用dll和返回结果都采用指针的形式
例如:在MATLAB中输入一个路径,然后调用DLL工程,使用OPENCV来读取路径下的图片,并返回长宽的数组
MATLAB如何使用动态链接库的形式调用C++,并实现指针的传入与传出
1、首先选择Win32控制台程序,然后如下图所示,选择生成DLL工程文件。
注意:如果使用较新版本的MATLAB调用此DLL,需要将该工程设置为64位版本的,不然调用会失败。
2、新建头文件,头文件名称需要与工程名称一致
头文件内容如下所示,表示定义了一个C++类型的主函数接口,以便MATLAB查找
readpicture.h
#ifndef READPICTURE_H
#define READPICTURE_H
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) double* read(char* in_path1);
#ifdef __cplusplus
}
#endif
#endif
3、新建一个cpp文件,名称与工程名称一致
添加如下代码,因为使用了opencv中读取照片的函数,所以需要先将此工程配置opencv的外部库环境(opencv也需64位),通过输入的路径,读取图片,然后将图片的宽高存放在数组中,将数组返回
readpicture.cpp
#include<string>
#include<opencv.hpp>
#include<opencv2\features2d\features2d.hpp>
#include<nonfree\nonfree.hpp>
#include"readpicture.h"
using namespace cv;
using namespace std;
double* read(char* in_path1)
{
string in_path = in_path1;
Mat img = imread(in_path);
double t[2];
t[0] = img.rows;
t[1] = img.cols;
return t;
}
4、将工程文件进行build,打开工程存放路径,将Debug下的.dll等文件以及代码的.h和.cpp文件都烤出到一个新的文件夹中。(如果定义了多个.h文件和多个.cpp文件,则都需要拷出)
插入图片
5、打开MATLAB文件,来调用编写好的DLL文件,需将路径更改至.dll所在的路径中。首先将matlab中的string转换成c++可读取的char字符串类型,可通过MATLAB中的libpointer进行转换。然后通过loadlibrary将dll文件加载进MATLAB,通过calllib来调用主程序,实现参数的传递,并将返回的指针存放在p这个变量中。因为只传递了指针的地址,所以只有在定义了这个指针的类型和大小后,才能获取指针所指向的内容。通过setdatatype定义指针的类型为double型,并且该指针指向的是一个2*1的矩阵,通过p.Value查看其具体的内容。
clc;clear;
i_path='D:\\temp\\2.jpg;
ii_path=libpointer('cstring',i_path);
%调用函数
loadlibrary('readpicture.dll','readpicture.h');
[p,xval]=calllib('readpicture', 'read', ii_path);
unloadlibrary cpts_generation;
%将返回的指针取出
setdatatype(p,'doublePtr',2,1);
res_cpts=p.Value';