Qt 使用 Matlab函数

news/2024/11/27 23:43:58/

背景:个人的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书写时的格式,否则会出现读取错误的情况


http://www.ppmy.cn/news/10918.html

相关文章

直观理解--马氏距离

首先我们很了解欧氏距离了&#xff0c;就是用来计算欧式空间&#xff08;就是我们常见的坐标系&#xff09;中两个点的距离的。 比如点 x(x1,…,xn)x (x_1,…,x_n)x(x1​,…,xn​) 和 y(y1,…,yn)y (y_1,…,y_n)y(y1​,…,yn​) 的欧氏距离为&#xff1a; d(x,y)(x1−y1)2(x2…

ESXI8.0一键安装黑群晖DSM7

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

KubeSphere使用外部ES进行日志收集(多行日志)

环境kubesphere &#xff1a; v3.3.1Docker&#xff1a;20.10.8Fluent-Bit&#xff1a;2.0.6-2.0.8ESKibana&#xff1a;7.9.3Docker日志示例{"log":"2023-01-10 11:32:50.021 - INFO --- [scheduling-1] traceId: p6spy : 1|conn-0|statement|SELECT fd_id A…

融合注意力模块SE基于轻量级yolov5s实践路面坑洼目标检测系统

在很多的项目实战中验证分析注意力机制的加入对于模型最终性能的提升发挥着积极正向的作用&#xff0c;在我之前的一些文章里面也做过了一些尝试&#xff0c;这里主要是想基于轻量级的s系列模型来开发构建路面坑洼检测系统&#xff0c;在模型中加入SE注意力模块&#xff0c;以期…

React相关扩展一(setState、lazyLoad、Hooks相关)(九)

系列文章目录 第一章&#xff1a;React基础知识&#xff08;React基本使用、JSX语法、React模块化与组件化&#xff09;&#xff08;一&#xff09; 第二章&#xff1a;React基础知识&#xff08;组件实例三大核心属性state、props、refs&#xff09;&#xff08;二&#xff0…

【寒假每日一题】DAY1.水仙花数

一、题目描述 求0&#xff5e;100000之间的所有“水仙花数”并输出。 什么是水仙花数&#xff1a; “水仙花数”是指一个n位数&#xff0c;其各位数字的n次方之和确好等于该数本身&#xff0c;如:153&#xff1d;1^3&#xff0b;5^3&#xff0b;3^3&#xff0c;则153是一个“水…

STM32 TIM PWM高阶操作:刹车及状态约束

STM32 TIM PWM高阶操作&#xff1a;刹车及状态约束 刹车及状态约束是STM32 TIM PWM控制里面比较复杂的一部分&#xff0c;涉及到PWM波形产生前&#xff0c;中&#xff0c;后的管脚状态输出。 这里先引入两个描述&#xff0c;一个是“半高阻”&#xff0c;意思是STM32管脚输出…

vue+xlsx实现表格的导入导出:

文章目录一、vue前端使用xlsx和 xlsx-style 导出excel&#xff0c;并修改样式:1、改造后效果&#xff1a;2、实现&#xff1a;3、引入库xlsx-style4、excelUtil.js文件二、前端xlsx插件怎么设置导出的excel列宽自适应&#xff1f;2-1、效果2-2、效果三、xlsx插件&#xff0c;导…