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