Qt使用Matlab函数的详细步骤

 更新时间:2023年01月18日 11:38:39   作者:Pandamahu  
由于项目需要,需要调用现有的matlab程序,下面这篇文章主要给大家介绍了关于Qt使用Matlab函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

背景:

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

总结

到此这篇关于Qt使用Matlab函数的文章就介绍到这了,更多相关Qt使用Matlab函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++多继承多态的实例详解

    C++多继承多态的实例详解

    这篇文章主要介绍了C++多继承多态的实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++顺序表的基本操作实现

    C++顺序表的基本操作实现

    大家好,本篇文章主要讲的是C++顺序表的基本操作实现,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 推荐几款实用的C++ 在线工具

    推荐几款实用的C++ 在线工具

    这篇文章主要推荐了几款实用的C++ 在线工具,帮助大家更好的进行c++开发,感兴趣的朋友可以了解下载。
    2020-10-10
  • C/C++ memset方法的误区

    C/C++ memset方法的误区

    memset 作为对内存初始化的函数,还是有不少坑和误区的,今天就来对这个函数作一个总结。避免后期使用不当踩入坑,需要的朋友可以参考下
    2021-04-04
  • Qt实现验证码相关功能的代码示例

    Qt实现验证码相关功能的代码示例

    验证码的原理基于人类视觉和计算机视觉的差异性,通过给用户显示一些难以被机器识别的图形或文字,让用户进行人机交互,确认自己的身份,这样可以有效保护网站安全,所以本给大家介绍了Qt实现验证码相关功能的代码示例,感兴趣的朋友可以参考下
    2024-01-01
  • C语言实现文本编辑器系统

    C语言实现文本编辑器系统

    这篇文章主要为大家详细介绍了C语言实现文本编辑器系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C语言实现班级成绩管理系统

    C语言实现班级成绩管理系统

    这篇文章主要为大家详细介绍了C语言实现班级成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C++重载运算符实现分数加减乘除

    C++重载运算符实现分数加减乘除

    这篇文章主要为大家详细介绍了C++重载运算符实现分数加减乘除,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • STL  priority_queue(优先队列)详解

    STL priority_queue(优先队列)详解

    这篇文章主要介绍了 STL priority_queue(优先队列)详解的相关资料,需要的朋友可以参考下
    2016-10-10
  • C++ OpenCV裁剪图片时发生报错的解决方式

    C++ OpenCV裁剪图片时发生报错的解决方式

    在图像处理中,我们经常根据需要截取图像中某一区域做处理,下面这篇文章主要给大家介绍了关于C++ OpenCV裁剪图片时发生报错的解决方式,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-07-07

最新评论