郭中華 連億東 伍馮潔 向光成 楊 智
(1.中山大學(xué)南方學(xué)院,廣東 廣州 510655;2.廣州大學(xué)實(shí)驗(yàn)中心,廣東 廣州 510006;3.深圳市廣天川科技有限公司,廣東 深圳 518129;4.中山大學(xué),廣東 廣州 510655)
本系統(tǒng)的圖像采集采用USB攝像頭,處理器使用三星公司的S5PV210,該處理器內(nèi)部集成PowerVR SGX540高性能圖形引擎,適合對(duì)圖像進(jìn)行處理。由于本人臉圖像采集系統(tǒng)后續(xù)作為人臉識(shí)別使用,所以在該系統(tǒng)中移植了OpenCv以便后續(xù)對(duì)人臉進(jìn)一步處理,系統(tǒng)整體架構(gòu)如圖1。
圖1 系統(tǒng)整體架構(gòu)
通過(guò)USB攝像頭獲取的人臉圖像要能正常在LCD屏上顯示,開(kāi)發(fā)板上需要設(shè)置以下環(huán)境,具體設(shè)置如下。
本文中使用的USB攝像頭驅(qū)動(dòng)為UVC類(lèi)攝像頭,從2.6.26版本開(kāi)始,Linux UVC驅(qū)動(dòng)被添加到內(nèi)核中,對(duì)內(nèi)核進(jìn)行配置就可以使用UVC。以下是配置步驟:
OpenCv是一個(gè)計(jì)算機(jī)視覺(jué)庫(kù),包含許多對(duì)圖像處理的函數(shù),也包括了對(duì)攝像頭設(shè)備的訪問(wèn)和從攝像頭設(shè)備捕獲圖像的函數(shù)。使用OpenCv庫(kù)函數(shù)來(lái)訪問(wèn)攝像頭,返回的圖像數(shù)據(jù)指針?lè)浅S欣诤罄m(xù)使用OpenCv的其它圖像處理函數(shù)。筆者在Linux系統(tǒng)下使用Cmake-gui配置交叉編譯OpenCv所需的makefile文件,根據(jù)預(yù)定設(shè)計(jì)在移植時(shí)有以下關(guān)鍵設(shè)置需要注意:
(1)指定操作系統(tǒng)
Operating System:填寫(xiě)Linux,要注意大小寫(xiě)。
(2)頭文件索引模式
Include Mode:需要設(shè)置為Search only in Target Root,這樣在編譯的時(shí)候會(huì)優(yōu)先選擇交叉編譯工具鏈目錄下的.h文件,以保證交叉編譯的順利進(jìn)行。
(3)OpenCv編譯添加選項(xiàng)
WITH_V4L:使用OpenCv的庫(kù)函數(shù)來(lái)打開(kāi)USB攝像頭設(shè)備必須勾上的一個(gè)選項(xiàng)。OpenCv有直接打開(kāi)攝像頭的庫(kù)函數(shù),依賴(lài)于V4L,如果沒(méi)有配置這一個(gè)選項(xiàng),很可能會(huì)導(dǎo)致在ARM嵌入式中打不開(kāi)攝像頭設(shè)備。
編寫(xiě)Qt程序時(shí),使用了OpenCv中的函數(shù),需要為編譯工具指明所引用的.h頭文件和.so庫(kù)文件的路徑。具體方法為:打開(kāi)Qt工程中的.pro文件,在其中添加OpenCv的.h和.so文件路徑。本文移植OpenCv后,ARM版的OpenCv庫(kù)文件在PC上的位置是:/usr/local/arm/opencv2.4.9.2/。根據(jù)本文的配置,在Qt工程中的.pro文件中添加以下內(nèi)容以完成在Qt中添加OpenCv。
為了對(duì)采集到的人臉圖像做進(jìn)一步處理,本系統(tǒng)使用了計(jì)算機(jī)視覺(jué)庫(kù)OpenCv,通過(guò)opencv采集人臉圖像的具體流程如圖2。
圖2 視頻圖像獲取流程
(1)打開(kāi)視頻設(shè)備
本系統(tǒng)對(duì)攝像頭設(shè)備進(jìn)行訪問(wèn)采用的是opencv自帶的函數(shù)cvCaptureFromCAM(index),index參數(shù)代表打開(kāi)的攝像頭,其中-1代表隨機(jī)打開(kāi)一個(gè)攝像頭,0、1、2…分別代表/dev/video0、/dev/video1、/dev/video2…。調(diào)用改函數(shù)打開(kāi)攝像頭設(shè)備后會(huì)返回一個(gè)CvCapture指針。在OpenCv中,CvCapture專(zhuān)門(mén)用來(lái)存儲(chǔ)視頻類(lèi)型文件的一些主要信息,如分辨率等等。主要代碼如下:
(2)獲取一幀圖像
在確保攝像頭打開(kāi)成功過(guò)后,則是對(duì)圖像信息的獲取,通過(guò)OpenCv中提供函數(shù)cvQueryFrame()可以獲取下一幀圖像,并返回一個(gè)IplImage指針。在OpenCv中,IplImage專(zhuān)門(mén)來(lái)用存儲(chǔ)圖像的信息,也是OpenCv中處理圖像的通用參數(shù)格式。主要代碼如下:
IplImage*frame;//創(chuàng)建一個(gè)IplImage指針
frame=cvQueryFrame(capture);//從攝像頭視頻流中獲取一幀圖像
(3)關(guān)閉視頻設(shè)備
OpenCv中提供函數(shù)cvReleaseCapture(CvCapture**capture),通過(guò)釋放Capture關(guān)閉攝像頭設(shè)備。主要代碼如下:
cvReleaseCapture(capture);
基于嵌入式Linux常見(jiàn)的GUI系統(tǒng)有MiniGUI、MicroWindows、OpenGUI和基于 Framebuffer的 Qt/Embedded。Qt提供了一個(gè)圖形用戶(hù)界面應(yīng)用程序的開(kāi)發(fā)框架,在這些基礎(chǔ)上做視頻圖像的顯示非常方便。本系統(tǒng)采用Qt/Embedded作為開(kāi)發(fā)平臺(tái),將通過(guò)OpenCv獲取到的圖像內(nèi)容繪制在LCD屏幕上進(jìn)行顯示。
根據(jù)預(yù)定設(shè)計(jì)最終人臉圖像將顯示到LCD屏上,為了使系統(tǒng)具有更好的人機(jī)交互性,在這里使用Qt作為圖形化用戶(hù)界面,其具體實(shí)現(xiàn)流程圖3所示。
圖3 圖像顯示程序流程圖
為了將人臉圖像在嵌入式板上流暢地顯示出來(lái),筆者做了以下改進(jìn):
(1)顯示界面大小設(shè)置
在Qt工程中打開(kāi).ui文件,拖出一個(gè)Label部件,如果屏幕足夠大,將Label的大小調(diào)整為使用的攝像頭采集圖像支持的最大分辨率得以完整顯示全部圖像內(nèi)容,如本文采用的LCD屏幕分辨率為800*480,攝像頭采集的圖像分辨率為640*480,則可以把Label設(shè)置為640*480,以此得到最佳的界面顯示效果。
(2)顏色通道轉(zhuǎn)換
在OpenCv中,Iplimage的顏色通道順序是BGR;而在Qt中,Qimage的顏色通道順序是RGB,為了使Qt正確地顯示出每一幀的圖像的顏色,需要將每一幀圖像的通道順序從BGR調(diào)整為RGB,OpenCv已提供了對(duì)應(yīng)的函數(shù)cvCvtColor(const CvArr*src,CvArr*dst,int code)[1]。主要代碼如下:
cvCvtColor(frame,frame,CV_BGR2RGB);//第一個(gè)參數(shù)為源圖像,第二個(gè)參數(shù)為結(jié)果輸出圖像,第三個(gè)參數(shù)為轉(zhuǎn)換方案。
(3)使用Qimage[2]
Qt中的Qimage類(lèi)對(duì)應(yīng)OpenCv的IplImage,是專(zhuān)門(mén)用來(lái)處理圖像的一個(gè)類(lèi)。使用OpenCv的函數(shù)打開(kāi)攝像頭,返回的是IplImage結(jié)構(gòu)的指針,IplImage的圖像數(shù)據(jù)賦值給Qimage,在Qt的Label上顯示。主要代碼如下:
#define image_Format QImage::Format_RGB888//圖像顯示格式
QImage qimage=QImage((uchar*)frame->imageData,frame->width,frame->height,image_Format);//創(chuàng)建一個(gè) Qimage對(duì)象,即Qimage圖像,其寬和高由原來(lái)的IplImage指定,圖像顯示格式為RGB888,圖像數(shù)據(jù)直接賦給Qimage圖像。
(4)將Qimage加載到Label上
QPixmap類(lèi)可以實(shí)現(xiàn)將圖像繪制在一個(gè)Label上,根據(jù)圖像的大小設(shè)定好Label的尺寸可以更完整地呈現(xiàn)圖像。主要代碼如下∶ui->Label->setPixmap(QPixmap∶fromImage(qimage));
(5)添加定時(shí)器,間隔刷新界面
圖像數(shù)據(jù)的連續(xù)采集和顯示是通過(guò)定時(shí)器實(shí)現(xiàn)的,QTimer類(lèi)提供了定時(shí)器信號(hào)和單觸發(fā)定時(shí)器。設(shè)置定時(shí)啟動(dòng)觸發(fā)周期,每當(dāng)定時(shí)器時(shí)間到就觸發(fā)一個(gè)定時(shí)器事件,在事件中調(diào)用VIDIOCMCAPTURE函數(shù)完成對(duì)圖像的采集,并通過(guò)QPixmap類(lèi)將圖像顯示到LCD上[3]。
本文基于三星s5pv210處理器和嵌入式Linux系統(tǒng),結(jié)合使用OpenCv和Qt編程詳細(xì)介紹了通過(guò)USB攝像頭實(shí)時(shí)顯示視頻圖像的一種方案。通過(guò)實(shí)驗(yàn)測(cè)試對(duì)比使用在Qt中添加V4L2驅(qū)動(dòng)方式采集圖像的方式[4],發(fā)現(xiàn)本文采用的方案在采集和顯示圖像的流暢度更好一些。此外,該方案適用于使用OpenCv進(jìn)一步對(duì)圖像進(jìn)行處理,可大大減少如人臉識(shí)別等計(jì)算機(jī)視覺(jué)處理系統(tǒng)的開(kāi)發(fā)成本和周期,經(jīng)推廣可用于計(jì)算機(jī)視覺(jué)項(xiàng)目涉及的多個(gè)領(lǐng)域。
[1]李明瑞.嵌入式人臉檢測(cè)與識(shí)別系統(tǒng)的研究與實(shí)現(xiàn)[D].長(zhǎng)沙理工大學(xué),2012:39-40.
[2]陳鵬.基于ARM11的嵌入式人臉識(shí)別系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)[D].鄭州:鄭州大學(xué)信息工程學(xué)院,2013:17-17.
[3]吳健.基于ARM的嵌入式USB圖像[J].現(xiàn)代顯示,2011,第127期:41-42.
[4]白長(zhǎng)清,陳沛.嵌入式終端基于Linux V4L2的圖像采集系統(tǒng)[J].科技資訊,2012:22-23.