您的位置:首页 > 教程 > C语言教程 > Qt使用Matlab函数的详细步骤

Qt使用Matlab函数的详细步骤

2023-01-18 12:08:19 来源:易采站长站 作者:

目录背景:环境Matlab函数实现将Matlab函数转换成动态链接库Qt调用运行以及问题处理总结背景:个人的Qt项目中,需要一个图片分割算法。该算法之前在Matlab上实现过,同时转成C++版本有点麻...

目录
背景:
环境
Matlab函数实现
将Matlab函数转换成动态链接库
Qt调用
运行以及问题处理
总结

背景:

个人的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 &nbandroidsp;
 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++的选项

Qt使用Matlab函数的详细步骤

之后在命令行输入mex -setup,同样是选择带C++的选项

Qt使用Matlab函数的详细步骤

随后点击APP,并点击下拉选项

Qt使用Matlab函数的详细步骤

选择Liberty Complier

Qt使用Matlab函数的详细步骤

“TYPE”部分选择C++ shared Library,“EXPORTED FUNCTIONS”是需要导出的m文件,点击+号选择需要编写的函数,选择Runtime downloaded from web,最后点击Package即可

Qt使用Matlab函数的详细步骤

在项目文件下会生成与函数名相同的子目录

Qt使用Matlab函数的详细步骤

进入for_Redistribution_files_only文件夹,将生成的dll/lib/h文件,放入Qt项目的代码文件夹中

Qt使用Matlab函数的详细步骤

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格式,在这里我是standroidring地址,因此需要将其转换为matlab能够识别的格式。同时需要注意图像地址在Qt书写时的格式,否则会出现读取错误的情况

总结

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

如有侵权,请发邮件到 [email protected]

相关文章

  • VS2019项目打包生成.exe文件与Setup的步骤实现

    VS2019项目打包生成.exe文件与Setup的步骤实现

    对于Visual Studio Installer ,我们通常称为:setup项目,是一个用于自定义安装部署的项目方案。但是在VS2019中不见了,微软是有意废除安装项目的,合作了一个第三方的安装项目单独使用。
    2020-03-13
  • 基于c++ ege图形库实现五子棋游戏

    基于c++ ege图形库实现五子棋游戏

    本文分享的五子棋实例,制作基于ege图像库, 首先需要安装配置ege环境 就可以编写小游戏了. 用到的ege库函数不多 , 主要是基于c++的. 先看界面效果: 输入界面:(就是控制台) 游戏胜利界面
    2020-01-06
  • C++基于easyx图形库实现推箱子游戏

    C++基于easyx图形库实现推箱子游戏

    本文实例为大家分享了C++实现推箱子游戏的具体代码,供大家参考,具体内容如下 头文件: #includestdio.h#includestdlib.h//#includeWindows.h#includeconio.h#includegraphics.h#includestdbool.h //播放音乐需要
    2020-06-30
  • VS2019 Nuget找不到包的问题处理

    VS2019 Nuget找不到包的问题处理

    VS不记得改了什么设置之后,发现找不到EF 解决办法 1、点击右侧的设置按钮 2、弹出窗中左侧树形结构选择“程序包源”,再点击右上方的添加按钮 输入一下信息:https://www.nuget.org/a
    2020-03-27
  • visual studio2019的安装以及使用图文步骤详解

    visual studio2019的安装以及使用图文步骤详解

    一、下载安装包 下载地址 选择visual studio 2019的community版本 二、下载好后运行 三、组件的选择 如果是用来学CC++的话,选择以下两个就够了 之后如果还需要其他一些功能的话,可以后
    2020-03-08
  • VScode编译C++ 头文件显示not found的问题

    VScode编译C++ 头文件显示not found的问题

    一直用codeblocks,想试试vscode,结果这个问题给我弄懵逼了。一开始以为是iostream这个头文件not found,后来发现第一个头文件都会这样显示,放到后面就不会了,然而,光这一个显示not
    2020-03-20
  • C++多线程获取返回值方法详解

    C++多线程获取返回值方法详解

    在许多时候,我们会有这样的需求——即我们想要得到线程返回的值。但是在C++11 多线程中我们注意到,std::thread对象会忽略顶层函数的返回值。 那问题来了,我们要怎么获得线程的返
    2020-06-25
  • JVM系列之String.intern的性能解析

    JVM系列之String.intern的性能解析

    String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成的字符串的数量,推荐尽量直接使用String Table中的字符串常量池中的元素。 那么String.intern的性能怎么样呢?我们一起来
    2020-06-23