1.测试代码1
cmd执行(需要安装matlab)
mcc -W cpplib:test -T link:lib test.m
matlab程序(test.m)
matlab配置
配置方法是一样的
.h E:\Program Files\Polyspace\R2020a\extern\include
.dll E:\Program Files\Polyspace\R2020a\extern\bin\win64
.lib E:\Program Files\Polyspace\R2020a\extern\lib\win64\microsoft
if (!mclInitializeApplication(NULL, 0))//初始化matlab
{
std::cout << "Could not initialize the application.\n";
return;
}
if(!Radar_processing_ugInitialize())//初始化matlab函数
{
std::cout << "Could not initialize the library.\n";
return;
}
mwArray txt_path(1, 1, mxDOUBLE_CLASS);
mwArray TimeStamp(1, 1, mxDOUBLE_CLASS);
mwArray TargetValue(1, 1, mxDOUBLE_CLASS);
char str[] = "F:/dataTest/data/input_data/Route_4";
mwArray folder_path(str);
Radar_processing_ug(3, txt_path, TimeStamp, TargetValue, folder_path);
mclWaitForFiguresToDie(NULL);//等待图像显示,不加此句无法显示图像
Radar_processing_ugTerminate();//关闭动态库,如果不关闭,matlab的绘制窗口不会被销毁
mclTerminateApplication();//关闭matlab函数
test.m
function result=test(a,b)
result =a+b
stem(c)
end
test.cpp
#include <iostream>
#include "test.h"
using namespace std;
int main()
{
bool isOk = 0;
if (!mclInitializeApplication(NULL, 0))
{
cout << "Could not initialize the application.\n";
return -1;
}
cout << "isOk = " << isOk << endl;
isOk = testInitialize();
cout << "isOk = " << isOk << endl;
mwArray a(1, 1, mxDOUBLE_CLASS); //函数参数类型为mwArray, 大小为1*1,数据类型为double
mwArray b(1, 1, mxDOUBLE_CLASS);
a(1, 1) = 1.8; //初始化参数
b(1, 1) = 2.9;
mwArray z(1, 1, mxDOUBLE_CLASS);
test(1, z, a, b);
cout << a << "+" << b << "=" << z << endl;
mclWaitForFiguresToDie(NULL);
testTerminate();
mclTerminateApplication();
return 0;
}
vs2019配置
添加.h,.lib,.dll
VS2019调用Matlab2019b生成的dll时初始化异常
https://blog.csdn.net/lvh98/article/details/124754645
2.测试代码2
mcc -W cpplib:imgtest -T link:lib imgtest.m
imgtest.m
function ImgShow(img)
imshow(img);
imgtest.cpp
#include "imgtest.h"
#include <opencv2/imgproc/imgproc.hpp> // Gaussian Blur
#include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat, Scalar)
#include <opencv2/highgui/highgui.hpp> // OpenCV window I/O
#include <iostream>
using namespace std;
using namespace cv;
int main() {
bool isOk = 0;//判断动态库是否初始化成功
if (!mclInitializeApplication(NULL, 0))
{
cout << "Could not initialize the application.\n";
return -1;
}
cout << "isOk = " << isOk << endl;// 0
isOk = imgtestInitialize(); // 动态库初始化成功
cout << "isOk = " << isOk << endl;// 1
Mat disp_image = imread("E:\\matlab\\pro\\extern2\\img1.png", 1);//调用opencv读取图片
/*将opencv图像数据转为Matlab图像数据*/
//Mat数据类型转为mwArray
mwSize mdim[3] = { disp_image.rows,disp_image.cols,3 };
mwArray mdisp_image(3, mdim, mxDOUBLE_CLASS, mxREAL);
//C++输入转matlab 接口矩阵转化及像素归一化
for (int j = 0; j < disp_image.rows; ++j) {
for (int i = 0; i < disp_image.cols; ++i) {
Vec3b& mp = disp_image.at<Vec3b>(j, i); //C++用向量存储像素值
double B = mp.val[0] * 1.0 / 255; //像素归一化到0-1之间
double G = mp.val[1] * 1.0 / 255;
double R = mp.val[2] * 1.0 / 255;
mdisp_image(j + 1, i + 1, 1) = R; //matlab中用三个面R,G,B存储像素值
mdisp_image(j + 1, i + 1, 2) = G; //C++图像矩阵像素值赋给matlab矩阵
mdisp_image(j + 1, i + 1, 3) = B;
}
}
imgtest(mdisp_image); //调用matlab函数
mclWaitForFiguresToDie(NULL); //等待图像显示,不加此句无法显示图像
imgtestTerminate(); //关闭动态库
mclTerminateApplication();
return 0;
}