Qt使用Matlab函数的详细步骤
Pandamahu 人气:0背景:
个人的Qt项目中,需要一个图片分割算法。该算法之前在Matlab上实现过,同时转成C++版本有点麻烦,因此尝试通过Qt与Matlab编程相结合的方式,实现该功能。
注意:以下所有功能及配置过程,默认已经将所需软件正确安装成功
环境
- Win10
- Qt 5.12.10 (MSVC 2017 64 bit)
- Matlab R2022b
Matlab函数实现
在Matlab中编写关于图像分割的函数 image_segment.m,假设其代码如下:
// 具体代码略去,函数的主要格式如下,必须是带参数的函数而不是脚本,否则会报错 function image_segment(rgb_path) close all; %UNTITLED7 Summary of this function goes here % Detailed explanation goes here I=imread(rgb_path);% normal map loading I=rgb2gray(I); ... ... imwrite(I,"mask.png");%输出结果,保存为tif图片 end
将Matlab函数转换成动态链接库
首先检查自己的mcc编译器是否可用
输入以下命令
!mcc
若正常,则会出现以下结果:
mcc Compile MATLAB functions for deployment outside MATLAB.
mcc [-options] fun [fun2...]
Options applicable across all deployment targets:
-? Display help for the mcc command
-a Add additional files or directories to be included in the build
-d Build output directory
-g Include debugging symbol information
-I Add a directory to be searched for MATLAB files
-v Verbose display of build
MATLAB Compiler
Standalone Application (MATLAB|Hadoop|Spark)
mcc -m <matlabFile.m>
Excel Add-In
mcc -W 'excel:<addinName>,<className>' -b <matlabFile.m>
Hadoop Deployable Archive
mcc -H -W 'hadoop:<archiveName>,CONFIG:<configFile.txt>' <mapperFile.m> <reducerFile.m> <datastoreInfo.mat>
Spark Application
mcc -C -W 'spark:<appName>,<sparkMajorVersion>' <matlabFile.m>
MATLAB Compiler SDK
C Shared Library
mcc -W lib:<libraryName> <matlabFile.m>
C++ Shared Library
mcc -W cpplib:<libraryName> <matlabFile.m>
.NET Assembly
mcc -W 'dotnet:<assemblyName>,<className>' <matlabFile.m>
Java Package
mcc -W 'java:<packageName>,<className>' <matlabFile.m>
Python Package
mcc -W python:<pythonPackageName> <matlabFile.m>
COM Component
mcc -W com:<componentName> <matlabFile.m>
MATLAB Production Server
Deployable Archive
mcc -W CTF:<archiveName> -U <matlabFile.m>
Deployable Archive for Excel Add-In
mcc -W mpsxl:<addinName> <matlabFile.m>
Replace single quotes with double when executing the mcc command from a Windows Command Prompt.
For more details, execute "doc mcc" from MATLAB.
随后在命令行输入mbuild -setup
,会出现如下结果。由于我们在C++环境下开发,选择带C++的选项
之后在命令行输入mex -setup
,同样是选择带C++的选项
随后点击APP,并点击下拉选项
选择Liberty Complier
“TYPE”部分选择C++ shared Library,“EXPORTED FUNCTIONS”是需要导出的m文件,点击+号选择需要编写的函数,选择Runtime downloaded from web,最后点击Package即可
在项目文件下会生成与函数名相同的子目录
进入for_redistribution_files_only文件夹,将生成的dll/lib/h文件,放入Qt项目的代码文件夹中
Qt调用
此处和上一步,可参考该链接中part3以及part4.1-part4.5
运行以及问题处理
待上面步骤依次执行后,开始将相关功能集成与Qt项目中
- 首先在mainwindow.h中,添加
#include "image_segment.h
头文件- 接着执行
limage_segmentInitialize()
初始化,这一步是必须要有的
由于我的Matlab函数需要接受输入图像的地址,那么我们的写法如下
QString str = "你的图像地址; char * charStr = str.toLocal8Bit().data(); mwArray rgb_path(charStr); image_segment(rgb_path);
需要注意的是,matlab在接收参数输入时,必须是mwArray格式,在这里我是string地址,因此需要将其转换为matlab能够识别的格式。同时需要注意图像地址在Qt书写时的格式,否则会出现读取错误的情况
总结
加载全部内容