畢雪華 王超
【摘要】文章介紹了Visual C++作為一種面向?qū)ο筌浖_發(fā)語言的長處、Matlab引擎(Matlab Engine)的特點及其在圖像處理方面的優(yōu)勢,并介紹了一種應(yīng)用VC++ 調(diào)用Matlab引擎本方法實現(xiàn)VC++與Matlab的混合編程,并將該方法應(yīng)用于數(shù)字圖像處理中。
【關(guān)鍵詞】Visual C++;Matlab引擎;圖像處理;混合編程
1.引言
Matlab,具有非常強(qiáng)大的數(shù)值計算、數(shù)據(jù)分析處理、系統(tǒng)分析、圖形顯示甚至符號運算的功能。VC++是當(dāng)前Windows 下的主要編程語言之一,把Matlab與Visual C++在圖像處理的應(yīng)用中結(jié)合起來,將會大大提高編程效率。本文通過在Visual C++中調(diào)用Matlab引擎的方法進(jìn)行圖像處理混合編程,這樣既方便了調(diào)用Matlab工具箱中的圖像處理函數(shù),又精簡了源程序代碼,還保留了Visual C++面向?qū)ο蠹翱梢暬萕INDOWS程序風(fēng)格和快速處理數(shù)據(jù)的能力,雖然這種方法并不能脫離Matlab環(huán)境獨立運行,但是事實證明:在需要Matlab強(qiáng)大工具箱支持的情況下,這種方法是行之有效的最好解決辦法。
2.方法
2.1 混合編程簡介
Matlab與高級語言接口的方法有很多種,按各種方法要求的環(huán)境不同,分為兩類:一類為需要Matlab環(huán)境支持的調(diào)用方法,這種方法要求系統(tǒng)安裝Matlab環(huán)境,如:調(diào)用引擎函數(shù)庫、使用ActiveX等。另一類是能生成獨立可執(zhí)行程序的方法,這種方法不再需要安裝Matlab環(huán)境,而只需要拷貝部分Matlab的動態(tài)鏈接庫。這類方法如:直接調(diào)用數(shù)學(xué)函數(shù)庫、使用編譯生成的獨立可執(zhí)行代碼等。
2.2 Matlab引擎介紹
Matlab engine提供了一組Matlab API函數(shù)(Application Program Interface),我們通過一種專門的對象類型———Matlab數(shù)組(mxArray)來完成Matlab引擎與Visual C++之間的數(shù)據(jù)交換。我們不必關(guān)心Matlab Engine是如何實現(xiàn)的,只要調(diào)用這些API函數(shù)即可。
3.系統(tǒng)設(shè)計
3.1 Visual C++與Matlab混合編程環(huán)境
3.1.1 Matlab環(huán)境設(shè)置:
Visual C++ 6.0要調(diào)用 Matlab Engine,還需要庫文件的支持,由于采用的是Matlab6.5,它自帶了庫文件,如:libeng.lib libmx.lib libmat.lib libmatlb.lib libmatlbmx.lib 等。需要把它們添加到工程當(dāng)中。但是如果應(yīng)用Matlab 版本過低 ,則需要將Matlab安裝目錄下\extern\include下的libeng.def libmx.def libmat.def 等文件生成相應(yīng)的庫文件。
3.1.2 Visual C++ 6.0設(shè)置
在VC++中創(chuàng)建單文檔、多文檔或者是基于對話框的MFC工程。將上述庫文件libeng.lib libmx.lib libmat.lib libmatlb.lib libmatlbmx.lib 等添加到工程中:Visual C++工程當(dāng)中project選項→setting選項→link選項卡→添加到Object/library Modules當(dāng)中去,特別注意:*.LIB中間只能用空格間斷。
設(shè)置Visual C++工具條中的select選項:在tools菜單中選擇select子菜單,然后再directory標(biāo)簽下添加一個指向c:\matlab6p5\extern\include目錄的include file;再添加一個指向c:\matlab6p5\extern\lib\win32\microsoft\msvc60目錄的library files
在所建立的工程當(dāng)中添加engine.h matlab.h,在相應(yīng)工程的.CPP中添加#include “engine.h” 和 #include “matrix.h”
3.2 程序?qū)崿F(xiàn)
本程序使用VC++調(diào)用Matlab引擎方法實現(xiàn)圖像處理:圖像濾波、邊緣提取、圖像反色、圖像二值化、圖像變色 。利用圖像反色舉例說明,其他效果實現(xiàn)方法與其類似,只要m文件編寫順利并調(diào)試通過,則實現(xiàn)方法相同。
3.2.1 .m文件編寫
在matlab中很容易能夠編寫出圖像反色的如下程序:
bor=imread('要顯示的圖片');
bor=double(bor);
[m n r]=size(bor);
for(k=1:r)
inv(:,:,k)=255-bor(:,:,k)
end
i=uint8(inv);
imshow(i)
3.2.2 VC++工程代碼編寫
在VC++中創(chuàng)建單文檔、多文檔或者是基于對話框的MFC工程。根據(jù)具體需要,建立工程,加入button控件,設(shè)置button控件的屬性,這里取名ID_rgb。
通過VC環(huán)境從用戶處得到的圖片的文件名是CString型 但是在Matlab工作區(qū)只支持char型的數(shù)據(jù),所以將CString型轉(zhuǎn)換為char型
通過本軟件圖像處理過程可以看出,在Visual C++中調(diào)用Matlab引擎簡單的幾條語句就可以很方便的對給定的圖像進(jìn)行各種各樣的處理,如上面所提到的:圖像濾波、邊緣提取、圖像反色、圖像二值化、圖像變色等,由于篇幅所限,僅列部分圖示。由于處理后的圖片是用Matlab打開的,Matlab對顯示的圖片提供了一系列的操作,如圖像的保存、放大、縮小、多角度觀察,在圖片上添加文字等等,而這些要在VC中編程實現(xiàn),將非常的麻煩。有數(shù)據(jù)顯示,用Matlab與Visual C++ 混合編程代碼長度要比單一Visual C++代碼長度大大縮短,并且運行時間要比單一Matlab語言編程減少許多,運行效率也有很大的提高。雖然引擎方法離不開Matlab環(huán)境,但是還是能夠提供較大的便利。
4.結(jié)論
綜上所述,利用Matlab engine簡單有效的實現(xiàn)在VC++中調(diào)用Matlab的功能,從而實現(xiàn)了圖像的處理。通過這個設(shè)計發(fā)現(xiàn)用引擎方法實現(xiàn)VC++和Matlab混合編程用于圖像處理有非常大的優(yōu)勢,這表明對于一個涉及到圖像處理和操作并在Windows環(huán)境中運行的一個應(yīng)用軟件的開發(fā),采用VC++和Matlab協(xié)同工作的方法可以大大提高軟件的開發(fā)效率,有利于充分發(fā)揮兩種軟件的自身所具有的獨特的優(yōu)勢,取得很好的效果。
參考文獻(xiàn)
[1]馬興義.Matlab 應(yīng)用開發(fā)指南[M].北京:機(jī)械工業(yè)出版社,2001(11).
[2]楊麗娜.淺析VC++與Matlab混合編程方法在圖像處理中的應(yīng)用[J].大眾科技,2006,88(2):73:74.
[3]劉志儉.Matlab應(yīng)用程序接口用戶指南[M].北京科學(xué)出版社,2000.
[4]陶紅,袁金榮.Matlab與C/VisualC++混合編程的實現(xiàn)[J].計算機(jī)工程與應(yīng)用,2000
基金項目:新疆醫(yī)科大學(xué)科研創(chuàng)新基金(編號:XJC201317)。
作者簡介:畢雪華(1982—),碩士,副教授,研究方向:計算機(jī)應(yīng)用。