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