《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于OpenCV的視頻圖像處理應(yīng)用研究
基于OpenCV的視頻圖像處理應(yīng)用研究
來(lái)源:微型機(jī)與應(yīng)用2010年第21期
郭 暉1,陳 光1,2
(1.東華大學(xué) 信息科學(xué)與技術(shù)學(xué)院,上海 201620;2.東華大學(xué) 數(shù)字化紡織服裝技術(shù)教育部工程研
摘要: 以嵌入式ARM為硬件平臺(tái),以ARM-Linux為軟件平臺(tái),在QT/Qtopia圖形用戶界面下,通過(guò)調(diào)用OpenCV圖形處理庫(kù)設(shè)計(jì)攝像頭應(yīng)用程序,最終實(shí)現(xiàn)把攝像頭采集到的視頻流數(shù)據(jù)顯示在Qtopia圖形用戶界面窗體上。介紹了QT編程的基本原理,闡述了OpenCV圖像處理庫(kù)的工作機(jī)制與使用方法。
Abstract:
Key words :

摘  要: 以嵌入式ARM為硬件平臺(tái),以ARM-Linux" title="ARM-Linux">ARM-Linux為軟件平臺(tái),在QT/Qtopia" title="QT/Qtopia">QT/Qtopia圖形用戶界面下,通過(guò)調(diào)用OpenCV" title="OpenCV">OpenCV圖形處理庫(kù)設(shè)計(jì)攝像頭應(yīng)用程序,最終實(shí)現(xiàn)把攝像頭采集到的視頻流數(shù)據(jù)顯示在Qtopia圖形用戶界面窗體上。介紹了QT編程的基本原理,闡述了OpenCV圖像處理庫(kù)的工作機(jī)制與使用方法。
關(guān)鍵詞: 嵌入式系統(tǒng)" title="嵌入式系統(tǒng)">嵌入式系統(tǒng);ARM-Linux;QT/Qtopia;OpenCV

    隨著計(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)用越來(lái)越廣泛。于是,如何以更高的效率和更低的成本設(shè)計(jì)視頻監(jiān)控設(shè)備的硬件和軟件就成為廣大研發(fā)人員關(guān)心的問(wèn)題。
    本文以嵌入式ARM作為硬件核心,在ARM-Linux QT/Qtopia圖形操作系統(tǒng)下開發(fā)攝像頭應(yīng)用程序,實(shí)現(xiàn)攝像頭對(duì)視頻圖像數(shù)據(jù)的采集、處理與顯示。為了提高應(yīng)用程序的開發(fā)效率,本設(shè)計(jì)采用了OpenCV圖形處理庫(kù)。攝像頭視頻顯示的流程為:首先ARM-Linux通過(guò)攝像頭驅(qū)動(dòng)程序控制攝像頭采集視頻流數(shù)據(jù),然后利用攝像頭應(yīng)用程序?qū)Σ杉降囊曨l流數(shù)據(jù)進(jìn)行處理,最終使經(jīng)過(guò)處理的視頻流數(shù)據(jù)能夠在LCD屏上顯示。采用上述平臺(tái)具有以下優(yōu)點(diǎn):(1)ARM-Linux與OpenCV庫(kù)同為開源的免費(fèi)軟件,開發(fā)者不僅可以根據(jù)需要修改源代碼來(lái)提高軟件開發(fā)的靈活性,而且可以節(jié)約開發(fā)成本;(2) OpenCV庫(kù)提供了許多視頻圖像處理的函數(shù),因此開發(fā)者不需要花費(fèi)大量的時(shí)間自己編寫,可以提高軟件的開發(fā)效率;(3)OpenCV庫(kù)中大部分函數(shù)都經(jīng)過(guò)匯編優(yōu)化,基于OpenCV的程序運(yùn)行起來(lái)有更高的效率。
    視頻監(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)應(yīng)用程序開發(fā)方法
1.1 硬件平臺(tái)

    嵌入式系統(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)。
1.2 軟件開發(fā)平臺(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庫(kù)、QT/Embedded 2.3.2庫(kù)、Qtopia 1.7.0庫(kù)、uic工具、qmake工具、tmake工具和QT designer工具等。
    (2)OpenCV軟件包。包括Libhighgui.so.0.9.7、Libhighgui.la、Libcxcore.so.0.9.7和Libcxcore.la等主要的庫(kù)。
    在開發(fā)攝像頭應(yīng)用程序之前,要把u-boot、ARM-Linux操作系統(tǒng)和外部設(shè)備的驅(qū)動(dòng)程序移植進(jìn)入ARM目標(biāo)板270-S中,這樣主機(jī)PC上開發(fā)的各類應(yīng)用程序軟件才能在ARM目標(biāo)板上運(yùn)行。
2 攝像頭應(yīng)用程序的構(gòu)架與關(guān)鍵技術(shù)
2.1 攝像頭應(yīng)用程序的結(jié)構(gòu)

    應(yīng)用程序由兩部分構(gòu)成:
    (1)在ARM-Linux QT/Qtopia圖形操作系統(tǒng)下的窗口界面設(shè)計(jì)(即人機(jī)界面的設(shè)計(jì))。這部分是通過(guò)調(diào)用QT/Embedded庫(kù)的各種庫(kù)函數(shù)與窗口組件來(lái)完成的。
    (2)對(duì)視頻流數(shù)據(jù)進(jìn)行處理,并把處理完成的圖像數(shù)據(jù)顯示在QT/Qtopia圖形界面下。這部分設(shè)計(jì)是攝像頭應(yīng)用程序的核心,除了調(diào)用QT/Embedded庫(kù)函數(shù),還要調(diào)用OpenCV庫(kù)函數(shù)。
攝像頭應(yīng)用程序結(jié)構(gòu)圖與庫(kù)函數(shù)的調(diào)用關(guān)系如圖2所示。


2.2 攝像頭應(yīng)用程序的關(guān)鍵技術(shù)
    本設(shè)計(jì)應(yīng)用程序以O(shè)penCV庫(kù)和QT庫(kù)為核心,負(fù)責(zé)處理視頻數(shù)據(jù)與圖像顯示。
2.2.1 OpenCV簡(jiǎn)介
    開放源代碼的計(jì)算機(jī)圖像處理庫(kù)OpenCV(Intel Open Source Computer Vision Library)是由一些C函數(shù)和C++類所組成的庫(kù),用來(lái)實(shí)現(xiàn)圖像處理及計(jì)算機(jī)圖像算法。OpenCV可以與英特爾公司所開發(fā)的圖形處理庫(kù)IPL兼容,所以它能夠高效而充分地運(yùn)行在Intel處理器上,主要用于對(duì)圖像進(jìn)行高級(jí)處理,例如特征檢測(cè)與跟蹤、運(yùn)動(dòng)分析及3D重建等。
2.2.2 嵌入式QT與Qtopia簡(jiǎn)介
    QT是跨平臺(tái)C++圖形用戶界面工具。由于QT采用面向?qū)ο箝_發(fā),具有跨多平臺(tái)、界面設(shè)計(jì)美觀等特點(diǎn),得到廣泛應(yīng)用。因?yàn)镵DE等項(xiàng)目使用QT作為支持庫(kù),所以有許多基于X-Windows的PC機(jī)上的應(yīng)用程序可以非常方便地移植到QT上。
    Qtopia是由Trolltech公司開發(fā)的基于QT庫(kù)的消費(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中。
3 QT窗體的設(shè)計(jì)方法
    在QT編程中,有兩種設(shè)計(jì)程序窗體(即人機(jī)界面)的方法。第一種方法完全采用面向?qū)ο蟮腃++編程語(yǔ)言實(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將編輯完成的窗體界面通過(guò)XML保存為.ui文件,然后由專用的uic界面編譯器將其轉(zhuǎn)換為標(biāo)準(zhǔn)C++的源文件。
4 視頻圖像處理與顯示
    視頻圖像處理與顯示的過(guò)程如圖3所示。

    其過(guò)程主要由四步組成。
    (1)初始化視頻結(jié)構(gòu)。關(guān)鍵代碼:
CvCapture*capture=0;
capture=cvCaptureFromCAM(-1);
cvSetCaptureProperty
(capture,CV_CAP_PROP_FRAME_WIDTH,320);
cvSetCaptureProperty
(capture,CV_CAP_PROP_FRAME_HEIGHT,240);
    在OpenCV應(yīng)用程序中都要定義一個(gè)CvCapture類型的指針變量capture。CvCapture類是視頻獲取結(jié)構(gòu),它沒有公共接口,各類圖像數(shù)據(jù)存儲(chǔ)位置的頭地址都可以賦值給指針變量capture。在capture指針被賦值之后,可以作為其他圖像處理函數(shù)的參數(shù)使用,完成各種圖像處理功能。
    OpenCV庫(kù)中用CvCapture*cvCaptureFromCAM(int index)函數(shù)對(duì)攝像頭分配視頻圖像數(shù)據(jù)流和初始化CvCapture結(jié)構(gòu)。函數(shù)參數(shù)index為攝像頭索引值。如果系統(tǒng)只有一個(gè)攝像頭或者使用哪個(gè)攝像頭都無(wú)所謂,則index的值為-1。本設(shè)計(jì)開發(fā)板只連接一個(gè)攝像頭,因此代碼為capture=cvCaptureFromCAM(-1)。
    對(duì)視頻數(shù)據(jù)結(jié)構(gòu)capture設(shè)置參數(shù)。用到的OpenCV的庫(kù)函數(shù)為int cvSetCaptureProperty(CvCapture* capture,int property_id,double value)。參數(shù)capture指定哪個(gè)視頻獲取結(jié)構(gòu)需要設(shè)置參數(shù);property_id為屬性標(biāo)識(shí)符,由幾個(gè)固定值組成,用來(lái)決定設(shè)置哪個(gè)參數(shù)。
    (2)開啟定時(shí)器后抓取圖像幀
    關(guān)鍵代碼:
QTimer CameraTimer->start(50,false);
int cvGrabFrame(capture);
IplImage*frame=cvRetrieveFrame(capture);
    如果視頻結(jié)構(gòu)初始化成功,則開啟由QT庫(kù)提供的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庫(kù)函數(shù)int cvGrabFrame(CvCapture*capture);從攝像頭實(shí)時(shí)采集的視頻流中快速抓取一幀圖像數(shù)據(jù),并且把這幀圖像數(shù)據(jù)存入ARM板的緩存中,這幀圖像數(shù)據(jù)對(duì)于用戶是不可見的。采用這種機(jī)制,是因?yàn)閏vGrabFrame()可以把一幀圖像數(shù)據(jù)以最快的速度存入緩存中[1]。
    接下來(lái),調(diào)用OpenCV庫(kù)函數(shù)cvRetrieveFrame()。這個(gè)函數(shù)把剛剛通過(guò)cvGrabFrame()抓取的一幀圖像數(shù)據(jù)從內(nèi)部緩存重新讀取出來(lái)。具體代碼為:IplImage*frame=cvRetrieveFrame(capture)。事實(shí)上在調(diào)用這個(gè)函數(shù)后,OpenCV內(nèi)部會(huì)完成多步復(fù)雜的圖像處理的工作,例如解碼等。
    (3)視頻格式的轉(zhuǎn)化
    關(guān)鍵代碼:
for(int y=0;y<height;y++)
{  for(int x=0; x<width; x++)
  {  for(int i=0;i<3;i++)
      {*dst++=*frame->imageData++;}
      *dst++=0;}}
    由于cvRetrieveFrame()重新讀取到的一幀圖像數(shù)據(jù)是IplImage類型,IplImage類型是24位真彩的三通道BGR(BGR24),而QT庫(kù)內(nèi)與圖像處理與顯示相關(guān)的函數(shù)只支持對(duì)1 bit、8 bit或者32 bit的位圖進(jìn)行處理[2]。因此為了使IplImage類型幀圖像能夠在QT/Qtopia圖像界面中顯示,又不降低視頻圖像質(zhì)量,需要通過(guò)程序?qū)?4位(BRG24)幀圖像轉(zhuǎn)化為32位(BRG32)幀圖像。
    BGR32每一個(gè)像素點(diǎn)除了擁有與BGR24相同的紅綠藍(lán)三種顏色,每種顏色8 bit外,要還在這三種顏色共24 bit的數(shù)據(jù)后面添加一組長(zhǎng)度為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)化后圖像的指針。
for(int i=0;i<3;i++)
  {*dst++=*frame->imageData++;}
*dst++=0;
    (4)將視頻圖像數(shù)據(jù)顯示在QT/Qtopia圖形界面
    關(guān)鍵代碼:
QImage image=QImage((uchar*)image32,frame->width,
frame->height,32,NULL,0,QImage::LittleEndian);
QPainter display(picCamera);
display.drawImage(0,0,image);
    首先調(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ù),把通過(guò)QImage類轉(zhuǎn)換過(guò)的圖像數(shù)據(jù)image繪制在主窗體的顯示器中,代碼為QPainter.drawImage(0,0,image)。
    通過(guò)以上步驟,應(yīng)用程序最終將攝像頭采集到的視頻圖像數(shù)據(jù)顯示在嵌入式設(shè)備的QT/qtopia圖形界面中。
ARM平臺(tái)的手持移動(dòng)監(jiān)控與顯示終端設(shè)備已經(jīng)廣泛應(yīng)用于社會(huì)的各個(gè)領(lǐng)域。OpenCV圖像處理庫(kù)以其開源性、高效性、靈活性幫助開發(fā)者大幅度地縮減開發(fā)周期。ARM-Linux QT/Qtopia與其他ARM端的圖像界面操作系統(tǒng)相比較有免費(fèi)、移植性好、內(nèi)核精簡(jiǎn)、更加穩(wěn)定的特點(diǎn)。本設(shè)計(jì)以O(shè)penCV圖像處理庫(kù)為核心,在ARM Linux QT/Qtopia圖形界面操作系統(tǒng)下實(shí)現(xiàn)攝像頭顯示的應(yīng)用程序,有非常好的實(shí)用性,可以廣泛應(yīng)用于各類ARM終端設(shè)備中。
參考文獻(xiàn)
[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.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。