陳玉華林來賓/洛陽師范學(xué)院信息技術(shù)學(xué)院;西門子(中國)有限公司機(jī)械傳動(dòng)部
VC與MATLAB混合編程在圖像識(shí)別中的應(yīng)用
陳玉華1林來賓2/1洛陽師范學(xué)院信息技術(shù)學(xué)院;2西門子(中國)有限公司機(jī)械傳動(dòng)部
詳細(xì)描述了在VC環(huán)境下利用Matlab進(jìn)行圖像識(shí)別、提取的方法。本文以一個(gè)成像光斑的識(shí)別為例,介紹了Matlab引擎的設(shè)置,從而使VC和Matlab之間進(jìn)行通信,實(shí)現(xiàn)圖像的快速識(shí)別。
混合編程;引擎;matlab
引言:MATLAB強(qiáng)大的科學(xué)計(jì)算與可視化功能,簡(jiǎn)單易用的開放式可擴(kuò)展環(huán)境,使MATLAB在許多學(xué)科領(lǐng)域中成為計(jì)算機(jī)輔助設(shè)計(jì)與分析、算法研究和應(yīng)用開發(fā)的基本工具和首選平臺(tái)。但由于其編譯器采用偽編譯的方式,在MATLAB中編寫的程序無法脫離其工作環(huán)境而獨(dú)立運(yùn)行。針對(duì)這個(gè)問題,Mathworks公司為MATLAB提供了應(yīng)用程序接口,允許MATLAB和其他應(yīng)用程序進(jìn)行數(shù)據(jù)交換,并且提供了C/C++數(shù)學(xué)和圖形函數(shù)庫,為在其他程序設(shè)計(jì)語言中調(diào)用MATLAB的高效算法提供了可能。
VC++是微軟公司利用C++的底層機(jī)理開發(fā)的編譯器,與其他一些C++編譯器相同,都以C++語言為編譯對(duì)象。
VC與MATLAB之間的接口方式有3種:1)在VC中利用MATLABEngine調(diào)用MATLAB函數(shù);2)將MATLAB程序編譯成MEX文件;3)在VC程序中利用MATLAB C++數(shù)學(xué)庫調(diào)用MATLAB函數(shù)。方法1是采用引擎方式,可以在非MATLAB為主的應(yīng)用程序中使用MATLAB功能,該方法不需連接整個(gè)MATLAB,只需在VC中嵌入必要的MATLAB Engine,便可以調(diào)用MATLAB中幾乎所有的函數(shù)或命令,無需編譯成C或C++程序;方法2是在以MATLAB為主的應(yīng)用程序中,需要在MATLAB應(yīng)用程序中調(diào)用其他語言的情況下使用,方法3的缺點(diǎn)是不能夠利用MATLAB中豐富的圖形句柄處理函數(shù)。本文采用的是引擎調(diào)用的方法。
MATLAB引擎是一組函數(shù),通過這組函數(shù),用戶可以在自己的應(yīng)用程序中實(shí)現(xiàn)對(duì)MATLAB的控制,來完成計(jì)算和圖形繪制等任務(wù),這相當(dāng)于把MATLAB當(dāng)成一個(gè)計(jì)算引擎。在開發(fā)一個(gè)專業(yè)的應(yīng)用程序時(shí),可以采用VC開發(fā)用戶界面,而分析部分采用MATLAB編程實(shí)現(xiàn),這樣可以利用MATLAB強(qiáng)大的分析功能,縮短程序開發(fā)周期。
MATLAB引擎的操作是通過啟動(dòng)一個(gè)獨(dú)立于應(yīng)用程序的進(jìn)程來實(shí)現(xiàn)的。這樣只需要把少量的引擎通信庫函數(shù)連接到應(yīng)用程序,因?yàn)閼?yīng)用程序和引擎是兩個(gè)獨(dú)立的進(jìn)程,它們之間的通信機(jī)制與開發(fā)環(huán)境相關(guān)。MATLAB提供了一個(gè)函數(shù)庫來實(shí)現(xiàn)對(duì)MATLAB的控制,這個(gè)函數(shù)庫的主要功能有:?jiǎn)?dòng)和結(jié)束MATLAB進(jìn)程;從MATLAB發(fā)送的接收數(shù)據(jù);向MATLAB發(fā)送命令。與其他接口方式相比,引擎提供的MATLAB功能支持是最全面的,它可以完成任何計(jì)算和繪圖操作,對(duì)所有的數(shù)據(jù)結(jié)構(gòu)提供完全支持。
要在VC中成功編譯MATLAB程序,必須包含引擎頭文件Engine.h并引入MATLAB對(duì)應(yīng)的庫文件:libeng.lib,libmat. lib,libmx.lib,libmex.lib。具體的設(shè)置方法如下(以VS2005為例),打開一個(gè)工程后:
1.通過菜單工具/選項(xiàng),打開設(shè)置屬性頁,進(jìn)入Directories頁面,在目錄下拉列表框中選擇Include files,添加路徑:“C: matlabexterninclude”(假定matlab安裝在C:matlab目錄)。
2.選擇Library files,添加路徑:C:matlabexternlibwin32microsoftmsvc60,該步只需設(shè)置一次。
3.通過菜單工程/設(shè)置,打開工程設(shè)置屬性頁,進(jìn)入Link頁面,在Object/library modules編輯框中,添加文件名libmx.lib libmat.lib libmex.lib libeng.lib。
該步每個(gè)工程都要單獨(dú)設(shè)定,因?yàn)槊總€(gè)工程所使用的MATLAB函數(shù)庫可以不一樣,因此,設(shè)置可能不同。上面只設(shè)定了libmx.lib libmat.lib libmex.lib libeng.lib,如果使用了其它的庫函數(shù),則需要添加相應(yīng)的庫文件。
在VC中編譯代碼時(shí),必須對(duì)頭文件“engine.h”進(jìn)行包含,這個(gè)頭文件非常重要?!癳ngine.h”中包含了MATLAB引擎庫中所有函數(shù)及其相關(guān)數(shù)據(jù)類型的定義,缺少了它,將無法使用MATLAB引擎。如果不加入這個(gè)頭文件,在程序編譯時(shí)就會(huì)出現(xiàn)“調(diào)用沒有定義的MATLAB引擎函數(shù)”的錯(cuò)誤提示。
接著啟動(dòng)引擎。定義一個(gè)引擎指針ep,該指針首先指向函數(shù)engOpen(),然后開始VC與MATLAB通信。結(jié)合一個(gè)光斑圖像提取的例子。
打開引擎后進(jìn)行進(jìn)行通信,在VC環(huán)境下,只需把MATLAB環(huán)境下的。m文件轉(zhuǎn)換為引擎調(diào)用即可。主要代碼如下:
最后,通信完畢后關(guān)閉matlab引擎即可。
程序識(shí)別的圖像前后對(duì)比如下所示:
圖1 識(shí)別前圖像
圖2 識(shí)別后圖像
VC和matlab在編程和計(jì)算上各有自己的優(yōu)缺點(diǎn),將它們結(jié)合起來,可以開發(fā)出來數(shù)值計(jì)算功能強(qiáng)大、界面友好的程序來。
[1]蘇金明等,Matlab與外部程序接口[M].,電子工業(yè)出版社,2004。
[2]袁林等,VC與MATLAB混合編程在圖像處理中的應(yīng)用 [J].微計(jì)算機(jī)信息,2008第24卷第4-3期
本文為河南省科技攻關(guān)項(xiàng)目項(xiàng)目編號(hào):102102210479。
陳玉華1976.11~,女,講師,碩士,研究方向?yàn)閳D像處理