C++调用Matlab引擎教程

        Matlab与C++混编注记,通过C++运行matlab脚本处理数据。

第一章 配置环境

        对于正常安装Matlab的

1. 添加包含目录 /extern/include

2.添加库目录 /extern/lib/win64/microsoft

3.添加库引用

#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
#pragma comment(lib, "libmex.lib")

4.添加环境变量 /bin/win64

5.程序中包含<engine.h>头文件

X. 注册

         对于安装绿色版,或者直接解压matlab的,或者使用mcr的,需要进行注册,如果在64位机上解压32位库,也需要注册引擎

1. 进入bin文件夹,运行 matlab /regserver

2. 注册之后在进行上述五项操作

第二章 引擎简介

engine

在程序运行时会弹出如图所示的白色Matlab命令行窗口,可以在该窗口中查看工作区或者进行调试。

第三章 函数手册

1.打开引擎:engOpen

2.关闭引擎:engClose

3.显示或隐藏Matlab引擎:engSetVisible(需要在打开的窗口调试matlab时可以打开)

4.获取工作空间的变量:engGetVariable

5.将变量存入工作区:engPutVariable

6.执行Matlab命令:engEvalString

7.使用mxArray结构

代码演示:

void OpenMatlab(){
	if (!(g_Ep = Matlab::engOpen(nullptr))){
		std::cout << "engOpen failed" << std::endl;
		return;
	}
	Matlab::engSetVisible(g_Ep, algparam.showprocess);
	Matlab::engEvalString(g_Ep, "cd F:\\MATLAB\\calibration");
	Matlab::engEvalString(g_Ep, "addpath(\'D:\\Program Files\\MATLAB\\R2016a\\toolbox\\calib')");
	Matlab::engEvalString(g_Ep, "clear");
	Matlab::engEvalString(g_Ep, "load('Calib_Results_stereo.mat')");
}

void CloseMatlab(){
	Matlab::engClose(g_Ep);
}

vector<cv::Point3d> stereoTriangulation(vector<pair<Ipoint, Ipoint>>& matches){
	OpenMatlab();
	Matlab::mxArray* leftPoint = Matlab::mxCreateDoubleMatrix(2, matches.size(), Matlab::mxREAL);
	Matlab::mxArray* rightPoint = Matlab::mxCreateDoubleMatrix(2, matches.size(), Matlab::mxREAL);
	for (int i = 0; i < matches.size(); ++i){
		Matlab::mxGetPr(leftPoint)[2 * i] = matches[i].first.x;
		Matlab::mxGetPr(leftPoint)[2 * i + 1] = matches[i].first.y;
		Matlab::mxGetPr(rightPoint)[2 * i] = matches[i].second.x;
		Matlab::mxGetPr(rightPoint)[2 * i + 1] = matches[i].second.y;
	}
	Matlab::engPutVariable(g_Ep, "xL", leftPoint);
	Matlab::engPutVariable(g_Ep, "xR", rightPoint);
	Matlab::engEvalString(g_Ep, "[XL, XR] = stereo_triangulation(xL, xR, om, T, fc_left, cc_left, kc_left, alpha_c_left, fc_right, cc_right, kc_right, alpha_c_right); ");
	Matlab::mxArray* xL = Matlab::engGetVariable(g_Ep, "XL");
	Matlab::mxArray* xR = Matlab::engGetVariable(g_Ep, "XR");

	vector<cv::Point3d> pointsL(matches.size()), pointsR(matches.size());
	for (int i = 0; i < matches.size(); ++i){
		pointsL[i].x = Matlab::mxGetPr(xL)[3 * i + 0];
		pointsL[i].y = Matlab::mxGetPr(xL)[3 * i + 1];
		pointsL[i].z = Matlab::mxGetPr(xL)[3 * i + 2];
		pointsR[i].x = Matlab::mxGetPr(xR)[3 * i + 0];
		pointsR[i].y = Matlab::mxGetPr(xR)[3 * i + 1];
		pointsR[i].z = Matlab::mxGetPr(xR)[3 * i + 2];
	}

	Matlab::mxDestroyArray(leftPoint);
	Matlab::mxDestroyArray(rightPoint);
	CloseMatlab();
	return pointsL;
}

        OK,See You Next Chapter!

《C++调用Matlab引擎教程》有2条评论

  1. 问下您matlab中的代码如何设置的高亮表示,就是看着很舒服,不知道用的什么插件,求分享

    回复

回复 PengChao 取消回复