王 直,湯芳利
(江蘇科技大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院,江蘇鎮(zhèn)江212003)
隨著科技的發(fā)展和工業(yè)制造水平的提高,現(xiàn)代工業(yè)特別是航空航天、造船、汽車、石油及天然氣儲(chǔ)運(yùn)、大型機(jī)械加工、渦輪機(jī)、發(fā)電機(jī)等領(lǐng)域,需要對(duì)大型結(jié)構(gòu)外部尺寸進(jìn)行精密三維測(cè)量,人工目測(cè)方法已遠(yuǎn)遠(yuǎn)不能滿足對(duì)質(zhì)量管理的需求.隨著機(jī)器視覺技術(shù)的發(fā)展以及現(xiàn)有計(jì)算機(jī)等技術(shù)具有的強(qiáng)大的數(shù)據(jù)處理能力,這為大尺寸工件的工業(yè)測(cè)量提供了技術(shù)保障.目前圖像采集方式包括與硬件相關(guān)的SDK開發(fā),及與硬件無關(guān)的WIA和TWAIN[1]等方式.SDK開發(fā)比較普遍,但是針對(duì)特定的輸入設(shè)備,需要重新進(jìn)行開發(fā);TWAIN協(xié)議是各種視頻采集硬件和處理軟件的通信協(xié)議和編程接口標(biāo)準(zhǔn),但是生產(chǎn)廠商支持的較少或者設(shè)備固件提供的能實(shí)現(xiàn)功能有限,局限性較大;WIA[2]是微軟系統(tǒng)下的圖像采集協(xié)議,采用該協(xié)議能實(shí)現(xiàn)對(duì)數(shù)字圖像設(shè)備的圖像采集,但是無法實(shí)現(xiàn)實(shí)時(shí)預(yù)覽.而Direct-Show技術(shù),不但能很好地回避采集設(shè)備硬件復(fù)雜性,方便地從采集卡上捕獲數(shù)據(jù),并且可以進(jìn)行相應(yīng)的后期處理乃至存儲(chǔ)到文件中.文中基于Direct-Show技術(shù)的圖像采集系統(tǒng)是在對(duì)船用鋼板實(shí)時(shí)監(jiān)控的基礎(chǔ)上,通過對(duì)DirectShow技術(shù)特點(diǎn)的研究,提出一種大尺寸工件的圖像采集系統(tǒng)方案.
DirectShow是由微軟公司開發(fā)的能夠讓軟件開發(fā)者對(duì)媒體文件執(zhí)行各種不同處理的應(yīng)用程序設(shè)計(jì)接口,為在Windows平臺(tái)上處理各種格式的媒體文件的回放、音視頻采集等高性能要求的多媒體應(yīng)用,提供了完整的解決方案[3].
DirectShow基于微軟公司W(wǎng)indows組件對(duì)象模型(COM)框架,DirectShow為大部份微軟公司程序設(shè)計(jì)語言提供了一個(gè)媒體的普遍接口,是以Filter為基礎(chǔ)的框架.文中利用它回避不可預(yù)知的硬件平臺(tái)這一優(yōu)勢(shì),實(shí)現(xiàn)USB攝像頭的圖像采集.DirectShow的系統(tǒng)概述如圖1[3].
圖1 DirectShow的系統(tǒng)Fig.1 DirectShow system overview
圖1中的過濾器圖在Windows注冊(cè)中尋找注冊(cè)了的Filter,并且為這些Filter創(chuàng)建本地提供的Graph,在這之后,它將所有的Filter連接在一起,并且由開發(fā)者來控制播放或者中止Graph,以實(shí)現(xiàn)不同應(yīng)用功能.
Filter是DirectShow中最基本的概念,也是Filter Graph中的最小功能模塊,F(xiàn)ilter之間通過PIN相互鏈接,根據(jù)實(shí)現(xiàn)功能不同可以分為3類,分別是Source Filter,Transform Filter和Rendering Filter,可以根據(jù)每個(gè)Filter的PIN來區(qū)別,Source Filter只有輸出PIN,Transform Filter既有輸入也有輸出PIN,Rendering Filter只有輸入PIN.Filter是一種COM組件,每個(gè)Filter上都至少實(shí)現(xiàn)了控制該Filter功能的IBaseFilter接口[3].
本系統(tǒng)應(yīng)用于測(cè)量的目標(biāo)船用鋼板規(guī)格是12m ×8m×3m,要準(zhǔn)確取得鋼板的長(zhǎng)寬高數(shù)據(jù),可以通過攝像頭1和2采集到鋼板的正視圖,通過攝像頭3采集到鋼板的側(cè)視圖,將采集到的數(shù)據(jù)存儲(chǔ)或傳輸?shù)接?jì)算機(jī)控制中心,進(jìn)行圖像處理.對(duì)于攝像頭角度的控制則是通過三角支架來調(diào)整的,應(yīng)用環(huán)境整體布局如圖2.
圖2 應(yīng)用現(xiàn)場(chǎng)示意圖Fig.2 Application's environment layout
選擇DirectShow技術(shù)在于它不但屏蔽了硬件的不可預(yù)知性,而且采集的圖像是屬于BMP格式,這種格式的特點(diǎn)是包含的圖像信息較豐富,這對(duì)于后續(xù)的圖像處理是一種優(yōu)勢(shì).
圖3是該系統(tǒng)的總體設(shè)計(jì).
圖3 系統(tǒng)總體設(shè)計(jì)Fig.3 Structure of the system
1)Filter模塊
根據(jù)GraphEdit工具設(shè)計(jì)的鏈路,在該模塊實(shí)現(xiàn)功能包括源過濾圖、SmartTee過濾圖、AVIMux過濾器、File Writer過濾器、SampleGrabber過濾器、MJPEG Compressor過濾器以及Video Render過濾器的創(chuàng)建,F(xiàn)ilter Graph的創(chuàng)建,所有Filter接口定義,這些都需要操作一類COM對(duì)象來完成(圖4).
圖4 FilterFig.4 Filter
2 )設(shè)備源選擇模塊
設(shè)備源選擇模塊主要功能是定義系統(tǒng)設(shè)備枚舉器接口,搜索枚舉系統(tǒng)中已注冊(cè)視頻設(shè)備,實(shí)現(xiàn)源設(shè)備的搜索與枚舉,并顯示到界面設(shè)備選擇列表框(圖5).最后定義了設(shè)備選擇功能,將選定設(shè)備綁定到源Filter,實(shí)現(xiàn)攝像頭與PC機(jī)的連接.
圖5 設(shè)備源選擇Fig.5 Source selection
3 )圖像信號(hào)控制模塊
圖像信號(hào)控制模塊主要功能是控制兩路Filter Graph鏈路的工作狀態(tài),分別是預(yù)覽鏈路和圖像采集鏈路,通過各個(gè)Filter PIN的接口來控制各個(gè)Filter功能,完成鏈路開啟以及關(guān)閉圖像預(yù)覽,信號(hào)源的開始與結(jié)束等(圖6).
圖6 圖像信號(hào)控制Fig.6 Image signal control
4 )圖像采集模塊
圖像采集模塊主要由自定義類CSampleGrabberCB實(shí)現(xiàn),完成對(duì)關(guān)鍵的抓圖Filter的功能設(shè)置,以及圖像屬性的查看,最終實(shí)現(xiàn)圖像的采集以及存儲(chǔ)(圖7).
圖7 圖像采集Fig.7 Image acquisition
采集設(shè)備的種類很多,按照接口方式可以分為PCI設(shè)備、AGP設(shè)備、USB設(shè)備、1394設(shè)備等.而按照驅(qū)動(dòng)模型可以分為WDM設(shè)備、VFW設(shè)備.WDM支持多種特性,比如直接支持電視接收、視頻會(huì)議、1394接口的設(shè)備、桌面攝像機(jī)、多條視頻流的同時(shí)輸出等.
DirectShow使用WDM video Capture Filter來支持WDM卡,使用另一個(gè)VFW Capture Filter來支持VFW卡.這兩種驅(qū)動(dòng)模型的采集卡都以Filter形式注冊(cè)為CLSIDVideolnputDeviceCategory類型,它們都要靠系統(tǒng)設(shè)備枚舉來創(chuàng)建.
在DirectShow的框架下,DirectShow通過特殊的包裝Filter對(duì)采集設(shè)備進(jìn)行了包裝,只要采集設(shè)備正確安裝,DirectShow就能把它包裝成一個(gè)Filter,并且在一定的目錄下注冊(cè),換句話說,應(yīng)用程序只要枚舉特定的類型目錄,就能知道系統(tǒng)中安裝了多少個(gè)什么類型的采集設(shè)備.DirectShow定義了很多類型的目錄供不同的Filter注冊(cè).
本系統(tǒng)采集設(shè)備的創(chuàng)建分為如下幾步[4]:
1 )使用 CoCreateInstance函數(shù)創(chuàng)建枚舉組(CLSIDSystemDeviceEnum)對(duì)象.
2 )用 ICreateDevEnum::CreateClassEnumerator為指定的Filter注冊(cè)類型目錄創(chuàng)建一個(gè)枚舉器,并獲得IEnumMoniker接口.
3 )使用IEnumMoniker接口方法枚舉指定類型目錄下的所有設(shè)備標(biāo)識(shí)(Device Moniker).
4 )用IMoniker::BindTOStorage后,可以訪問設(shè)備標(biāo)識(shí)的屬性集,如DisplayName,F(xiàn)riendlyName.
5 )調(diào)用IMoniker::BindToObject可以將設(shè)備標(biāo)識(shí)成一個(gè)Source Filter.
文中采集設(shè)備是只有一個(gè)Capture輸出PIN,主要用于圖像數(shù)據(jù)的采集.為了能實(shí)時(shí)預(yù)覽畫面,添加Smart Tee Filter用于預(yù)覽和采集的分路,其中Sample Grabber是一個(gè)傳輸Filter用于抓取圖片,構(gòu)建的Filter Graph如圖8.
圖8 Filter圖Fig.8 Filter graph
DirectShow通過Filter與各式各樣的設(shè)備,包括本地文件系統(tǒng)、TV調(diào)諧器、視頻采集卡、編解碼器、顯示器、聲卡等進(jìn)行通信.因此DirectShow將應(yīng)用程序與設(shè)備之間的多樣性和復(fù)雜性隔離開[5].
系統(tǒng)實(shí)時(shí)預(yù)覽流程見圖9,圖像采集流程見圖10.
圖9 實(shí)時(shí)預(yù)覽流程Fig.9 Flow chart of real-time preview
由于Filter是基于COM機(jī)制實(shí)現(xiàn)的,對(duì)于各個(gè)Filter的創(chuàng)建,需要掌握一些基本的COM編程知識(shí),在Visual C++中創(chuàng)建COM對(duì)象,程序部分代碼如下:
圖10 圖像采集流程Fig.1 0 Flow chart of image acquisition
由于DirectShow采集進(jìn)來的圖像是BMP格式,文中采用的是緩沖區(qū)模式從實(shí)時(shí)源中抓取圖像,它采用回調(diào)函數(shù)的形式將數(shù)據(jù)幀傳遞給應(yīng)用程序[5].從攝像頭中獲取數(shù)據(jù)幀最常見的辦法是利用Sample Grabber Filter來完成,由于視頻流中的每一幀數(shù)據(jù)都會(huì)經(jīng)過Filter,只要讓Filter通過回調(diào)機(jī)制通告上層應(yīng)用程序進(jìn)行對(duì)當(dāng)前數(shù)據(jù)幀進(jìn)行處理便可實(shí)現(xiàn)圖像采集.但這種方式需要采用回調(diào)函數(shù)形式將數(shù)據(jù)傳遞給應(yīng)用程序,而回調(diào)函數(shù)是從Directshow的SDK包含的ISampleGrabberCB類中派生出自己的類,然后實(shí)現(xiàn)其虛函數(shù).
文中的CSampleGrabberCB類就是定義為一個(gè)響應(yīng)圖像采集的回調(diào)函數(shù)[6],它是ISampleGrabber-CB的派生類,通過實(shí)現(xiàn)該類的虛函數(shù),來完成圖像的數(shù)據(jù)采集和存儲(chǔ)功能,實(shí)現(xiàn)回調(diào)函數(shù)的一個(gè)實(shí)例,實(shí)現(xiàn)關(guān)鍵代碼如下:
所有的工作都在BufferCB函數(shù)里完成,當(dāng)有一個(gè)新的數(shù)據(jù)幀到來的時(shí)候,這個(gè)函數(shù)就會(huì)被Sample Grabber調(diào)用到.
關(guān)鍵代碼如下所示:
文中圖像格式數(shù)據(jù)結(jié)構(gòu)的定義,使用到的結(jié)構(gòu)體是BITMAPINFOHEADER.
通過搜索可選設(shè)備按鈕后,當(dāng)前系統(tǒng)可選設(shè)備名稱將顯示在設(shè)備可選列表框,選擇設(shè)備后,點(diǎn)擊選定設(shè)備(圖11).
圖11 設(shè)備選擇Fig.1 1 Device selected
軟件能簡(jiǎn)單高效的實(shí)現(xiàn)實(shí)時(shí)預(yù)覽,系統(tǒng)忽略硬件的復(fù)雜性,將輸入設(shè)備統(tǒng)一封裝成并注冊(cè)成Source Filter,顯示結(jié)果如圖12.
圖12 圖像預(yù)覽Fig.1 2 Image preview
通過配置并實(shí)現(xiàn)捕捉圖像的Grabber Filter,成功實(shí)現(xiàn)實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)流中抓取圖像幀.系統(tǒng)采集到信息豐富的BMP格式圖像,有利于后續(xù)的圖像處理,通過拍照按鈕,進(jìn)行抓圖,先點(diǎn)擊瀏覽按鈕,選擇圖像存儲(chǔ)目標(biāo)路徑后,再點(diǎn)擊拍照,便可將圖像采集到目標(biāo)文件夾中,這是利用了DirectShow技術(shù),對(duì)于支持自定義功能的Filter來實(shí)現(xiàn)的.保存路徑設(shè)置如圖13,圖像采集結(jié)果如圖14.
圖13 選擇存儲(chǔ)路徑Fig.1 3 Select storage path
圖14 圖像采集Fig.1 4 Image acqusition
點(diǎn)擊照片屬性,可以查看采集到的照片的相關(guān)信息,此外,系統(tǒng)預(yù)留有錄制視頻和結(jié)束視頻按鈕,本系統(tǒng)通過控制支架來移動(dòng)攝像頭,將船用鋼板錄制成視頻文件,通過網(wǎng)絡(luò)傳輸?shù)竭h(yuǎn)程控制計(jì)算機(jī)中心,記錄現(xiàn)場(chǎng)環(huán)境情況,便于后期處理分析備用.界面顯示如圖15[78].
圖15 圖像屬性Fig.1 5 Image property
文中采用攝像頭是1 080P格式的高清攝像頭,同步采集圖像信息,實(shí)驗(yàn)中實(shí)現(xiàn)了基于DirectShow圖像預(yù)覽和抓圖,基于DirectShow的單幀圖像抓取功能已經(jīng)實(shí)現(xiàn),效果良好,可以很好地實(shí)現(xiàn)抓圖的功能,界面友好,攝像頭的位置和參數(shù)符合圖像采集的要求.不足的一點(diǎn)是,對(duì)于采集設(shè)備的參數(shù)設(shè)置不夠靈活,在采集實(shí)現(xiàn)過程中,發(fā)現(xiàn)數(shù)據(jù)會(huì)延時(shí).由采集到的圖像屬性信息可知,采集到的圖像并不是很大,這樣對(duì)于后期圖像的Matlab算法處理,圖像矩陣數(shù)據(jù)不至于太龐大,同樣的算法下,能夠加快處理速度,而且該程序?qū)τ赪indows系統(tǒng)能識(shí)別的攝像頭均適用.結(jié)果表明,在圖像分辨率并不是特別高要求的場(chǎng)合下,該系統(tǒng)能實(shí)現(xiàn)現(xiàn)場(chǎng)的實(shí)時(shí)監(jiān)控和圖像采集.
References)
[1] TWAIN Specification Version 2.2[CP/OL].[20131110].http:∥www.twain.org/,2012.
[2] Microsoft Corporation.Microsoft software MSDN[EB/ OL].http:∥msdn Microsoft.com.2013.
[3] 陸其明.DirectShow開發(fā)指南[M].北京:清華大學(xué)出版社,2003:151,127152.
[4] Microsoft Corporation.DirectX 9.0 SDK MSDN[EB/ OL].http:∥msdn Microsoft.com.2013.
[5] Mark D P.The programming Microsoft DirectShow for digital video and TV[M].Washington:Microsoft Press.2003,4.
[6] 朱尹華,周尚波,王興星,等.基于DirectShow視頻幀實(shí)時(shí)捕捉的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2011,28(1):3738.
Zhu Yinhua,Zhou Shangbo,Wang Xingxing,et al.Designing and implementing real-time video frame capturing based on DirectShow[J].Computer Science and Software,2011,28(1):3738.(in Chinese)
[7] Ivor Horton.C++入門經(jīng)典[M].3版.李予敏,譯.北京:清華大學(xué)出版社,2006:536578.
[8] George Shepherd,Scot Wingo.深入淺析MFC[M].1版.趙劍云,董瑾,譯.北京:中國電力出版社,2003: 149192,326377.
[9] 曲揚(yáng).Visual C++實(shí)效編程280例[M].北京:人民郵電出版社,2009:111164.
[10] 孟月華,鄧基園.DirectShow技術(shù)的應(yīng)用研究與開發(fā)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2013,22(6):198.
Meng Yuehua,Deng Jiyuan.Application and development of DirectShow technology[J].Computer Systems&Applications,2013,22(6):198.(in Chinese)