Qt使用Matlab函數的詳細步驟
背景:
個人的Qt項目中,需要一個圖片分割算法。該算法之前在Matlab上實現(xiàn)過,同時轉成C++版本有點麻煩,因此嘗試通過Qt與Matlab編程相結合的方式,實現(xiàn)該功能。
注意:以下所有功能及配置過程,默認已經將所需軟件正確安裝成功
環(huán)境
- Win10
- Qt 5.12.10 (MSVC 2017 64 bit)
- Matlab R2022b
Matlab函數實現(xiàn)
在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函數轉換成動態(tài)鏈接庫
首先檢查自己的mcc編譯器是否可用
輸入以下命令
!mcc
若正常,則會出現(xiàn)以下結果:
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
,會出現(xiàn)如下結果。由于我們在C++環(huán)境下開發(fā),選擇帶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
運行以及問題處理
待上面步驟依次執(zhí)行后,開始將相關功能集成與Qt項目中
- 首先在mainwindow.h中,添加
#include "image_segment.h
頭文件- 接著執(zhí)行
limage_segmentInitialize()
初始化,這一步是必須要有的
由于我的Matlab函數需要接受輸入圖像的地址,那么我們的寫法如下
QString str = "你的圖像地址; char * charStr = str.toLocal8Bit().data(); mwArray rgb_path(charStr); image_segment(rgb_path);
需要注意的是,matlab在接收參數輸入時,必須是mwArray格式,在這里我是string地址,因此需要將其轉換為matlab能夠識別的格式。同時需要注意圖像地址在Qt書寫時的格式,否則會出現(xiàn)讀取錯誤的情況
總結
到此這篇關于Qt使用Matlab函數的文章就介紹到這了,更多相關Qt使用Matlab函數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!