Qt使用Matlab函數(shù)的詳細(xì)步驟
背景:
個(gè)人的Qt項(xiàng)目中,需要一個(gè)圖片分割算法。該算法之前在Matlab上實(shí)現(xiàn)過,同時(shí)轉(zhuǎn)成C++版本有點(diǎn)麻煩,因此嘗試通過Qt與Matlab編程相結(jié)合的方式,實(shí)現(xiàn)該功能。
注意:以下所有功能及配置過程,默認(rèn)已經(jīng)將所需軟件正確安裝成功
環(huán)境
- Win10
- Qt 5.12.10 (MSVC 2017 64 bit)
- Matlab R2022b
Matlab函數(shù)實(shí)現(xiàn)
在Matlab中編寫關(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)鏈接庫
首先檢查自己的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)境下開發(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)選擇需要編寫的函數(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)行以及問題處理
待上面步驟依次執(zhí)行后,開始將相關(guān)功能集成與Qt項(xiàng)目中
- 首先在mainwindow.h中,添加
#include "image_segment.h
頭文件- 接著執(zhí)行
limage_segmentInitialize()
初始化,這一步是必須要有的
由于我的Matlab函數(shù)需要接受輸入圖像的地址,那么我們的寫法如下
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í)的格式,否則會(huì)出現(xiàn)讀取錯(cuò)誤的情況
總結(jié)
到此這篇關(guān)于Qt使用Matlab函數(shù)的文章就介紹到這了,更多相關(guān)Qt使用Matlab函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言字符串函數(shù)與內(nèi)存函數(shù)精講
這篇文章主要介紹一些c語言中常用字符串函數(shù)和內(nèi)存函數(shù)的使用,并且為了幫助讀者理解和使用,也都模擬實(shí)現(xiàn)了他們的代碼,需要的朋友可以參考一下2022-04-04OpenCV實(shí)現(xiàn)二值圖像的邊緣光滑處理
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)二值圖像的邊緣光滑處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07