郭 暉 ,陳 光 ,2
(1.東華大學(xué) 信息科學(xué)與技術(shù)學(xué)院,上海 201620;2.東華大學(xué) 數(shù)字化紡織服裝技術(shù)教育部工程研究中心,上海 201620)
隨著計(jì)算機(jī)和微電子技術(shù)的迅速發(fā)展,嵌入式ARM及ARM-Linux操作系統(tǒng)已廣泛應(yīng)用于工業(yè)控制、通信、醫(yī)療儀器等各個(gè)領(lǐng)域。許多公共場(chǎng)所和居民小區(qū)等地點(diǎn)都安裝了視頻監(jiān)控系統(tǒng),因而視頻監(jiān)控與顯示終端的應(yīng)用越來越廣泛。于是,如何以更高的效率和更低的成本設(shè)計(jì)視頻監(jiān)控設(shè)備的硬件和軟件就成為廣大研發(fā)人員關(guān)心的問題。
本文以嵌入式ARM作為硬件核心,在ARM-Linux QT/Qtopia圖形操作系統(tǒng)下開發(fā)攝像頭應(yīng)用程序,實(shí)現(xiàn)攝像頭對(duì)視頻圖像數(shù)據(jù)的采集、處理與顯示。為了提高應(yīng)用程序的開發(fā)效率,本設(shè)計(jì)采用了OpenCV圖形處理庫。攝像頭視頻顯示的流程為:首先ARM-Linux通過攝像頭驅(qū)動(dòng)程序控制攝像頭采集視頻流數(shù)據(jù),然后利用攝像頭應(yīng)用程序?qū)Σ杉降囊曨l流數(shù)據(jù)進(jìn)行處理,最終使經(jīng)過處理的視頻流數(shù)據(jù)能夠在LCD屏上顯示。采用上述平臺(tái)具有以下優(yōu)點(diǎn):(1)ARM-Linux與OpenCV庫同為開源的免費(fèi)軟件,開發(fā)者不僅可以根據(jù)需要修改源代碼來提高軟件開發(fā)的靈活性,而且可以節(jié)約開發(fā)成本;(2)OpenCV庫提供了許多視頻圖像處理的函數(shù),因此開發(fā)者不需要花費(fèi)大量的時(shí)間自己編寫,可以提高軟件的開發(fā)效率;(3)OpenCV庫中大部分函數(shù)都經(jīng)過匯編優(yōu)化,基于OpenCV的程序運(yùn)行起來有更高的效率。
視頻監(jiān)控與顯示系統(tǒng)的硬件和軟件結(jié)構(gòu)如圖1所示。
硬件由三部分組成:(1)攝像頭。負(fù)責(zé)采集原始視頻流數(shù)據(jù);(2)ARM開發(fā)板。負(fù)責(zé)處理原始的視頻流數(shù)據(jù);(3)LCD液晶顯示器。負(fù)責(zé)圖像數(shù)據(jù)的顯示。軟件部分也由三部分組成,這三部分運(yùn)行在ARM-Liunx操作系統(tǒng)下:(1)攝像頭驅(qū)動(dòng)程序;(2)攝像頭應(yīng)用程序??刂圃贏RM板把攝像頭采集到的視頻流數(shù)據(jù)讀入內(nèi)存中,然后對(duì)內(nèi)存中的圖像數(shù)據(jù)進(jìn)行處理,即把原始圖像數(shù)據(jù)轉(zhuǎn)化為可以在ARM-Linux QT/Qtopia操作系統(tǒng)下顯示的圖像數(shù)據(jù);(3)LCD顯示驅(qū)動(dòng)程序。本文將著重闡述運(yùn)行在ARM-Linux QT下的攝像頭應(yīng)用程序。
圖1 系統(tǒng)的硬件和軟件結(jié)構(gòu)
嵌入式系統(tǒng)開發(fā)平臺(tái)由主機(jī)PC機(jī)和目標(biāo)機(jī)ARM板組成。
主機(jī)PC要求CPU為Pentium 4或以上,擁有一個(gè)25針的并口、一個(gè)9針的RS-232串口和一個(gè)20GB的硬盤。ARM板是由深圳市武耀博德信息技術(shù)有限公司生產(chǎn)的270-S平臺(tái)。
軟件程序的開發(fā)是在PC機(jī)上完成的,PC機(jī)上的開發(fā)環(huán)境是Redhat Linux 9.0。Redhat提供了許多與程序開發(fā)有關(guān)的工具,還要在PC機(jī)的Linux操作系統(tǒng)下安裝QT和OpenCV軟件工具包。
(1)QT軟件包。包括QT/X11 2.3.2庫、QT/Embedded 2.3.2庫、Qtopia 1.7.0庫、uic工具、qmake工具、tmake工具和QT designer工具等。
(2)OpenCV軟件包。 包括 Libhighgui.so.0.9.7、Libhighgui.la、Libcxcore.so.0.9.7和 Libcxcore.la等主要的庫。
在開發(fā)攝像頭應(yīng)用程序之前,要把u-boot、ARMLinux操作系統(tǒng)和外部設(shè)備的驅(qū)動(dòng)程序移植進(jìn)入ARM目標(biāo)板270-S中,這樣主機(jī)PC上開發(fā)的各類應(yīng)用程序軟件才能在ARM目標(biāo)板上運(yùn)行。
應(yīng)用程序由兩部分構(gòu)成:
(1)在ARM-Linux QT/Qtopia圖形操作系統(tǒng)下的窗口界面設(shè)計(jì) (即人機(jī)界面的設(shè)計(jì))。這部分是通過調(diào)用QT/Embedded庫的各種庫函數(shù)與窗口組件來完成的。
(2)對(duì)視頻流數(shù)據(jù)進(jìn)行處理,并把處理完成的圖像數(shù)據(jù)顯示在QT/Qtopia圖形界面下。這部分設(shè)計(jì)是攝像頭應(yīng)用程序的核心,除了調(diào)用QT/Embedded庫函數(shù),還要調(diào)用OpenCV庫函數(shù)。
攝像頭應(yīng)用程序結(jié)構(gòu)圖與庫函數(shù)的調(diào)用關(guān)系如圖2所示。
圖2 攝像頭應(yīng)用程序結(jié)構(gòu)圖
本設(shè)計(jì)應(yīng)用程序以O(shè)penCV庫和QT庫為核心,負(fù)責(zé)處理視頻數(shù)據(jù)與圖像顯示。
2.2.1 OpenCV簡介
開放源代碼的計(jì)算機(jī)圖像處理庫OpenCV(Intel?Open Source Computer Vision Library)是由一些C函數(shù)和C++類所組成的庫,用來實(shí)現(xiàn)圖像處理及計(jì)算機(jī)圖像算法。OpenCV可以與英特爾公司所開發(fā)的圖形處理庫IPL兼容,所以它能夠高效而充分地運(yùn)行在Intel處理器上,主要用于對(duì)圖像進(jìn)行高級(jí)處理,例如特征檢測(cè)與跟蹤、運(yùn)動(dòng)分析及3D重建等。
2.2.2 嵌入式QT與Qtopia簡介
QT是跨平臺(tái)C++圖形用戶界面工具。由于QT采用面向?qū)ο箝_發(fā),具有跨多平臺(tái)、界面設(shè)計(jì)美觀等特點(diǎn),得到廣泛應(yīng)用。因?yàn)镵DE等項(xiàng)目使用QT作為支持庫,所以有許多基于X-Windows的PC機(jī)上的應(yīng)用程序可以非常方便地移植到QT上。
Qtopia是由Trolltech公司開發(fā)的基于QT庫的消費(fèi)電子設(shè)備綜合應(yīng)用平臺(tái)。Qtopia包含完整的應(yīng)用層、靈活的用戶界面、窗口操作系統(tǒng)、應(yīng)用程序啟動(dòng)程序以及開發(fā)框架,并具有游戲和多媒體、工作輔助應(yīng)用程序、同步框架、PIM應(yīng)用程序、Internet應(yīng)用程序等。本設(shè)計(jì)應(yīng)用程序顯示在Qtopia中。
在QT編程中,有兩種設(shè)計(jì)程序窗體 (即人機(jī)界面)的方法。第一種方法完全采用面向?qū)ο蟮腃++編程語言實(shí)現(xiàn),開發(fā)者需要手工編寫所有的代碼;另一種是采用編寫代碼與QT Designer設(shè)計(jì)工具相結(jié)合的方法。QT Designer工具會(huì)幫助開發(fā)者完成大部分繪制窗體的工作。本文攝像頭應(yīng)用程序的設(shè)計(jì)采用第二種方法。QT Designer是QT系統(tǒng)專用的窗口界面開發(fā)工具,它不包含任何編譯器,而僅僅提供一個(gè)可視化界面編輯器。QT Designer將編輯完成的窗體界面通過XML保存為.ui文件,然后由專用的uic界面編譯器將其轉(zhuǎn)換為標(biāo)準(zhǔn)C++的源文件。
視頻圖像處理與顯示的過程如圖3所示。
圖3 視頻圖像處理步驟
其過程主要由四步組成。
(1)初始化視頻結(jié)構(gòu)。關(guān)鍵代碼:
在OpenCV應(yīng)用程序中都要定義一個(gè)CvCapture類型的指針變量capture。CvCapture類是視頻獲取結(jié)構(gòu),它沒有公共接口,各類圖像數(shù)據(jù)存儲(chǔ)位置的頭地址都可以賦值給指針變量capture。在capture指針被賦值之后,可以作為其他圖像處理函數(shù)的參數(shù)使用,完成各種圖像處理功能。
OpenCV庫中用 CvCapture*cvCaptureFromCAM(int index)函數(shù)對(duì)攝像頭分配視頻圖像數(shù)據(jù)流和初始化CvCapture結(jié)構(gòu)。函數(shù)參數(shù)index為攝像頭索引值。如果系統(tǒng)只有一個(gè)攝像頭或者使用哪個(gè)攝像頭都無所謂,則index的值為-1。本設(shè)計(jì)開發(fā)板只連接一個(gè)攝像頭,因此代碼為 capture=cvCaptureFromCAM(-1)。
對(duì)視頻數(shù)據(jù)結(jié)構(gòu)capture設(shè)置參數(shù)。用到的OpenCV的庫函數(shù)為int cvSetCaptureProperty(CvCapture*capture,int property_id,double value)。參數(shù)capture指定哪個(gè)視頻獲取結(jié)構(gòu)需要設(shè)置參數(shù);property_id為屬性標(biāo)識(shí)符,由幾個(gè)固定值組成,用來決定設(shè)置哪個(gè)參數(shù)。
(2)開啟定時(shí)器后抓取圖像幀
關(guān)鍵代碼:
如果視頻結(jié)構(gòu)初始化成功,則開啟由QT庫提供的QTimer定時(shí) 器 。 代碼 表 示 為 :CameraTimer->start(50,false)。參數(shù)“50”表示 QT定時(shí)器每隔 50 ms觸發(fā)一次,即發(fā)出一個(gè)內(nèi)部信號(hào)調(diào)用一個(gè)槽函數(shù),該槽函數(shù)負(fù)責(zé)從視頻數(shù)據(jù)流中抓取一幀圖像。
該槽函數(shù)抓取一幀圖像的方法為:首先調(diào)用OpenCV庫函數(shù)intcvGrabFrame(CvCapture*capture);從攝像頭實(shí)時(shí)采集的視頻流中快速抓取一幀圖像數(shù)據(jù),并且把這幀圖像數(shù)據(jù)存入ARM板的緩存中,這幀圖像數(shù)據(jù)對(duì)于用戶是不可見的。采用這種機(jī)制,是因?yàn)閏vGrabFrame()可以把一幀圖像數(shù)據(jù)以最快的速度存入緩存中[1]。
接下來,調(diào)用 OpenCV庫函數(shù)cvRetrieveFrame()。這個(gè)函數(shù)把剛剛通過cvGrabFrame()抓取的一幀圖像數(shù)據(jù)從內(nèi)部緩存重新讀取出來。具體代碼為:IplImage*frame=cvRetrieveFrame(capture)。事實(shí)上在調(diào)用這個(gè)函數(shù)后,OpenCV內(nèi)部會(huì)完成多步復(fù)雜的圖像處理的工作,例如解碼等。
(3)視頻格式的轉(zhuǎn)化
關(guān)鍵代碼:
由于cvRetrieveFrame()重新讀取到的一幀圖像數(shù)據(jù)是IplImage類型,IplImage類型是 24位真彩的三通道BGR(BGR24),而QT庫內(nèi)與圖像處理與顯示相關(guān)的函數(shù)只支持對(duì) 1 bit、8 bit或者32 bit的位圖進(jìn)行處理[2]。因此為了使IplImage類型幀圖像能夠在QT/Qtopia圖像界面中顯示,又不降低視頻圖像質(zhì)量,需要通過程序?qū)?4位(BRG24)幀圖像轉(zhuǎn)化為32位(BRG32)幀圖像。
BGR32每一個(gè)像素點(diǎn)除了擁有與BGR24相同的紅綠藍(lán)三種顏色,每種顏色8 bit外,要還在這三種顏色共24 bit的數(shù)據(jù)后面添加一組長度為8 bit的0數(shù)據(jù)。因此,圖像格式轉(zhuǎn)化的方法應(yīng)該在原始的24位圖像數(shù)據(jù)中每隔三個(gè)字節(jié)加入一個(gè)字節(jié)的0。下列代碼為BGR24->BGR32圖像中一個(gè)點(diǎn)的轉(zhuǎn)化程序,其中frame->imageData為原始圖像的指針,dst為轉(zhuǎn)化后圖像的指針。
(4)將視頻圖像數(shù)據(jù)顯示在QT/Qtopia圖形界面
關(guān)鍵代碼:
首先調(diào)用QImage構(gòu)造函數(shù)把上一步轉(zhuǎn)換好的32位(BGR32)圖像數(shù)據(jù)初始化為QT圖像數(shù)據(jù)格式;然后調(diào)用QT的低水平繪制類QPainter的構(gòu)造函數(shù)對(duì)主窗口的顯示器組建初始化;初始化結(jié)束后將調(diào)用QPainter類的drawImage成員函數(shù),把通過QImage類轉(zhuǎn)換過的圖像數(shù)據(jù)image繪制在主窗體的顯示器中,代碼為QPainter.drawImage(0,0,image)。
通過以上步驟,應(yīng)用程序最終將攝像頭采集到的視頻圖像數(shù)據(jù)顯示在嵌入式設(shè)備的QT/qtopia圖形界面中。
ARM平臺(tái)的手持移動(dòng)監(jiān)控與顯示終端設(shè)備已經(jīng)廣泛應(yīng)用于社會(huì)的各個(gè)領(lǐng)域。OpenCV圖像處理庫以其開源性、高效性、靈活性幫助開發(fā)者大幅度地縮減開發(fā)周期。ARM-Linux QT/Qtopia與其他ARM端的圖像界面操作系統(tǒng)相比較有免費(fèi)、移植性好、內(nèi)核精簡、更加穩(wěn)定的特點(diǎn)。本設(shè)計(jì)以O(shè)penCV圖像處理庫為核心,在ARM Linux QT/Qtopia圖形界面操作系統(tǒng)下實(shí)現(xiàn)攝像頭顯示的應(yīng)用程序,有非常好的實(shí)用性,可以廣泛應(yīng)用于各類ARM終端設(shè)備中。
[1]BRADSKI G, KAEHLER A.Learning openCV: computer vision with the OpenCV library.O’Reilly Media, 2008, 9.
[2]Trolltech公司.Qtopia和 Qt/Embedded參考文檔 [OL].http://www.qiliang.net/qt/index.html,2005.
[3]韋東山.嵌入式 Linux應(yīng)用開發(fā)完全手冊(cè).北京:人民郵電出版社,2008.