Qt使用Matlab函數(shù)的詳細(xì)步驟
背景:
個(gè)人的Qt項(xiàng)目中,需要一個(gè)圖片分割算法。該算法之前在Matlab上實(shí)現(xiàn)過(guò),同時(shí)轉(zhuǎn)成C++版本有點(diǎn)麻煩,因此嘗試通過(guò)Qt與Matlab編程相結(jié)合的方式,實(shí)現(xiàn)該功能。
注意:以下所有功能及配置過(guò)程,默認(rèn)已經(jīng)將所需軟件正確安裝成功
環(huán)境
- Win10
- Qt 5.12.10 (MSVC 2017 64 bit)
- Matlab R2022b
Matlab函數(shù)實(shí)現(xiàn)
在Matlab中編寫(xiě)關(guān)于圖像分割的函數(shù) image_segment.m,假設(shè)其代碼如下:
// 具體代碼略去,函數(shù)的主要格式如下,必須是帶參數(shù)的函數(shù)而不是腳本,否則會(huì)報(bào)錯(cuò) 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");%輸出結(jié)果,保存為tif圖片 end
將Matlab函數(shù)轉(zhuǎn)換成動(dòng)態(tài)鏈接庫(kù)
首先檢查自己的mcc編譯器是否可用
輸入以下命令
!mcc
若正常,則會(huì)出現(xiàn)以下結(jié)果:
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,會(huì)出現(xiàn)如下結(jié)果。由于我們?cè)贑++環(huán)境下開(kāi)發(fā),選擇帶C++的選項(xiàng)

之后在命令行輸入mex -setup,同樣是選擇帶C++的選項(xiàng)

隨后點(diǎn)擊APP,并點(diǎn)擊下拉選項(xiàng)

選擇Liberty Complier

“TYPE”部分選擇C++ shared Library,“EXPORTED FUNCTIONS”是需要導(dǎo)出的m文件,點(diǎn)擊+號(hào)選擇需要編寫(xiě)的函數(shù),選擇Runtime downloaded from web,最后點(diǎn)擊Package即可

在項(xiàng)目文件下會(huì)生成與函數(shù)名相同的子目錄

進(jìn)入for_redistribution_files_only文件夾,將生成的dll/lib/h文件,放入Qt項(xiàng)目的代碼文件夾中

Qt調(diào)用
此處和上一步,可參考該鏈接中part3以及part4.1-part4.5
運(yùn)行以及問(wèn)題處理
待上面步驟依次執(zhí)行后,開(kāi)始將相關(guān)功能集成與Qt項(xiàng)目中
- 首先在mainwindow.h中,添加
#include "image_segment.h頭文件- 接著執(zhí)行
limage_segmentInitialize()初始化,這一步是必須要有的
由于我的Matlab函數(shù)需要接受輸入圖像的地址,那么我們的寫(xiě)法如下
QString str = "你的圖像地址;
char * charStr = str.toLocal8Bit().data();
mwArray rgb_path(charStr);
image_segment(rgb_path);
需要注意的是,matlab在接收參數(shù)輸入時(shí),必須是mwArray格式,在這里我是string地址,因此需要將其轉(zhuǎn)換為matlab能夠識(shí)別的格式。同時(shí)需要注意圖像地址在Qt書(shū)寫(xiě)時(shí)的格式,否則會(huì)出現(xiàn)讀取錯(cuò)誤的情況
總結(jié)
到此這篇關(guān)于Qt使用Matlab函數(shù)的文章就介紹到這了,更多相關(guān)Qt使用Matlab函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例
驗(yàn)證碼的原理基于人類(lèi)視覺(jué)和計(jì)算機(jī)視覺(jué)的差異性,通過(guò)給用戶(hù)顯示一些難以被機(jī)器識(shí)別的圖形或文字,讓用戶(hù)進(jìn)行人機(jī)交互,確認(rèn)自己的身份,這樣可以有效保護(hù)網(wǎng)站安全,所以本給大家介紹了Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例,感興趣的朋友可以參考下2024-01-01
C語(yǔ)言實(shí)現(xiàn)文本編輯器系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)文本編輯器系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
C語(yǔ)言實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
C++重載運(yùn)算符實(shí)現(xiàn)分?jǐn)?shù)加減乘除
這篇文章主要為大家詳細(xì)介紹了C++重載運(yùn)算符實(shí)現(xiàn)分?jǐn)?shù)加減乘除,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
STL priority_queue(優(yōu)先隊(duì)列)詳解
這篇文章主要介紹了 STL priority_queue(優(yōu)先隊(duì)列)詳解的相關(guān)資料,需要的朋友可以參考下2016-10-10
C++?OpenCV裁剪圖片時(shí)發(fā)生報(bào)錯(cuò)的解決方式
在圖像處理中,我們經(jīng)常根據(jù)需要截取圖像中某一區(qū)域做處理,下面這篇文章主要給大家介紹了關(guān)于C++?OpenCV裁剪圖片時(shí)發(fā)生報(bào)錯(cuò)的解決方式,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07

