張倩倩,裴海龍
(華南理工大學(xué)自動化科學(xué)與工程學(xué)院,廣東 廣州 510640)
隨著電子和信息技術(shù)的發(fā)展,視頻處理在現(xiàn)代生活中得到廣泛應(yīng)用,如視頻監(jiān)控、視頻會議、多媒體信息傳遞等,同時視頻處理平臺也在隨著科技的進(jìn)步發(fā)生著顯著的變化。如今以應(yīng)用為中心且軟硬件可剪裁的嵌入式系統(tǒng)已經(jīng)進(jìn)入了人們生活的方方面面,成為當(dāng)今最熱門的領(lǐng)域之一。而Linux作為嵌入式操作系統(tǒng)又有諸多優(yōu)勢,例如它的低成本開發(fā)、多平臺支持、內(nèi)核可定制等[1]。本文基于嵌入式Linux設(shè)計了一套雙路圖像的采集系統(tǒng),并經(jīng)過合適的進(jìn)程通信方式將兩路圖像結(jié)合起來,最后利用套接口傳輸?shù)竭h(yuǎn)程計算機(jī)上,直觀地顯示處理結(jié)果。本系統(tǒng)目前作為實(shí)驗(yàn)室的低空飛行平臺下火災(zāi)檢測項(xiàng)目的組成部分,已取得較好的試驗(yàn)效果。
根據(jù)系統(tǒng)目標(biāo)要求,本系統(tǒng)硬件部分包括CM-T3530核心板、USB彩色攝像頭、紅外攝像頭、USB圖像采集卡和遠(yuǎn)程計算機(jī)等。本系統(tǒng)采用的是Compulab公司的CM-T3530嵌入式核心板,它功耗低、體積小、支持Linux操作系統(tǒng),內(nèi)置的WiFi接口實(shí)現(xiàn)了工業(yè)標(biāo)準(zhǔn)的無線網(wǎng)絡(luò)連接,進(jìn)而方便了實(shí)驗(yàn)和多用戶操作。系統(tǒng)中采用SBT35作為該核心板的底板,在無需外接電路的情況下,已經(jīng)內(nèi)置了USB主從控制接口可以直接連接USB設(shè)備。
由于Linux內(nèi)核包含UVC(USB Video Class)模塊及USB設(shè)備驅(qū)動,同時USB端口具有即插即用、使用方便的優(yōu)點(diǎn),因此本系統(tǒng)的彩色攝像頭選用普通的USB彩色攝像頭即可,這里選用的是羅技的USB網(wǎng)絡(luò)攝像頭Pro9000[2]。在無人機(jī)平臺下進(jìn)行火災(zāi)監(jiān)測時,火災(zāi)過程中產(chǎn)生的煙霧和火焰等火災(zāi)參量會發(fā)射紅外線,所以應(yīng)該選用合適的紅外攝像機(jī)將這些火災(zāi)參量記錄下來,為后續(xù)的火焰識別等工作打下良好的基礎(chǔ)。本系統(tǒng)選用的紅外攝像頭為FLIR公司的一款長波非制冷系列紅外攝像機(jī)Photo320,除了可滿足以上應(yīng)用外,其體積小和重量輕的特點(diǎn)也很適合作為無人機(jī)平臺下的機(jī)載攝像頭。該攝像機(jī)輸出信號為復(fù)合視頻信號(端子為AV端子),故需采用USB圖像采集卡將該模擬信號轉(zhuǎn)變?yōu)閿?shù)字信號以讓嵌入式微處理器做進(jìn)一步處理。為了和Photo320攝像機(jī)相連,圖像采集卡的輸入端子應(yīng)該有AV端子,顯然其輸出端口為USB端口和SB-T35的USB端口相連。結(jié)合以上要求選用Mine Vcap2800,該圖像采集卡包含AV端子和S端子視頻輸入,1路USB輸出,可將采集到的模擬圖像信號實(shí)時地轉(zhuǎn)換為數(shù)字信號。
圖1即為系統(tǒng)硬件組成,本視頻系統(tǒng)的主要工作(采集、通信、傳輸)都在核心板CM-T3530上完成,處理后的視頻流通過WiFi網(wǎng)絡(luò)即可傳送給遠(yuǎn)程計算機(jī)。圖2為本系統(tǒng)的基本框架,這里將CM-T3530上的彩色圖像和紅外圖像程序分別記為Color_image和Infra_image,將PC機(jī)上的彩色圖像和紅外圖像的顯示程序分別記為Color_show和Infra_show。
硬件搭建完成后,就要進(jìn)行軟件環(huán)境的配置。由于采用嵌入式Linux來作為CM-T3530的操作系統(tǒng),故首先應(yīng)得到適合的內(nèi)核鏡像、模塊和文件系統(tǒng)以搭建基本的軟件環(huán)境。CM-T3530 支持的內(nèi)核版本為 Linux-2.6.32,首先應(yīng)采用其默認(rèn)配置文件cm_t35_defconfig對Linux內(nèi)核進(jìn)行初步配置,該文件可節(jié)省許多工作量。但是根據(jù)系統(tǒng)要求,需要正確識別視頻設(shè)備,并可利用V4L2(Video for Linux Two)驅(qū)動進(jìn)行圖像采集等,故應(yīng)在默認(rèn)配置的基礎(chǔ)上進(jìn)行一些其他的配置[3]。
Linux的內(nèi)核配置選項(xiàng)可以有兩種方式被編譯,即以靜態(tài)的方式直接編譯進(jìn)內(nèi)核或者以模塊的方式動態(tài)加載。當(dāng)針對特定的硬件平臺時,由于其內(nèi)核鏡像的大小可能是有限制的,應(yīng)有所選擇地將部分驅(qū)動編譯成模塊,對該系統(tǒng)比較重要的模塊做以下說明:
1)V4L2的上層videodev模塊可以注冊1個主設(shè)備號為81的字符設(shè)備,它結(jié)合次設(shè)備號確定了1個具體的設(shè)備文件,然后調(diào)用V4L2的各種應(yīng)用函數(shù)即可對設(shè)備文件進(jìn)行操作。
2)該系統(tǒng)USB接口的攝像頭要求內(nèi)核必須加載uvcvideo模塊(USB Video Class Driver),只有該模塊被加載才可以對具體的攝像頭設(shè)備文件進(jìn)行視頻采集。由于模塊間具有依賴關(guān)系,因此加載模塊時需注意其先后順序。
3)針對系統(tǒng)選用的視頻采集卡的芯片組成,應(yīng)選取相應(yīng)編解碼芯片的驅(qū)動。例如本系統(tǒng)的USB圖像采集卡用到EMPIA公司的EM2860解碼芯片,故應(yīng)在內(nèi)核選項(xiàng)Device Drivers選取“Empia EM28xx USB video capture support”,否則該采集卡將不能被正確識別運(yùn)用。
4)為了使底板SB-T35的USB口、MTD設(shè)備等基本接口正常使用,內(nèi)核可以將相應(yīng)的驅(qū)動以靜態(tài)加載的方式進(jìn)行編譯。
配置完內(nèi)核之后,可利用交叉編譯工具鏈來編譯內(nèi)核,進(jìn)而得到相應(yīng)的內(nèi)核鏡像和模塊。結(jié)合默認(rèn)的文件系統(tǒng),即可將新的內(nèi)核鏡像成功地安裝到核心板上,設(shè)置正確的啟動參數(shù)即可啟動進(jìn)入新的嵌入式操作系統(tǒng),接下來就可以交叉編譯相應(yīng)的程序以達(dá)到采集和傳輸圖像的目的。
V4L2是Linux操作系統(tǒng)中專門供影音圖像開發(fā)的應(yīng)用編程接口,它為視頻設(shè)備提供了內(nèi)核驅(qū)動[4-6]。在Linux系統(tǒng)中,視頻設(shè)備同其他設(shè)備一樣有其相應(yīng)的設(shè)備文件,其名稱一般是在/dev/video*。由于編譯內(nèi)核時已經(jīng)將所有相關(guān)選項(xiàng)編譯進(jìn)來,故可以在/dev下發(fā)現(xiàn)/dev/video0和/dev/video1,它們是分別用來標(biāo)識USB彩色攝像頭和USB圖像采集卡(即紅外攝像頭)。此時便可以根據(jù)V4L2的采集流程對這兩個設(shè)備文件進(jìn)行操作,流程圖如圖3所示,以下簡要說明相關(guān)的函數(shù)和數(shù)據(jù)結(jié)構(gòu)(以/dev/video0例)。
圖3 圖像采集流程圖
1)打開設(shè)備文件,調(diào)用fd=open("/dev/video0",O_RDWR)可以返回文件描述符,在后面程序中通過使用此文件描述符對設(shè)備進(jìn)行操作。
2)系統(tǒng)調(diào)用ioctl(fd,VIDIOC_QUERYCAP,& cap)查詢視頻設(shè)備的屬性,如能否進(jìn)行視頻采集、能否對設(shè)備進(jìn)行讀寫操作等。
3)系統(tǒng)調(diào)用ioctl(fd,VIDIOC_S_FMT,& fmt)設(shè)置視頻圖像格式和幀格式,將結(jié)構(gòu)體fmt的內(nèi)容寫入到設(shè)備文件的初始化中。
4)在V4L2下截取圖像有2種方法:mmap內(nèi)存映射方式和直接讀取設(shè)備方式。使用mmap映射方式不需要任何數(shù)據(jù)拷貝,效率高,為此采用mmap內(nèi)存映射方式。首先系統(tǒng)調(diào)用VIDIOC_REQBUFS向設(shè)備驅(qū)動申請幀緩存,一般幀緩沖數(shù)目不超過5。然后程序調(diào)用calloc向用戶空間申請相同數(shù)目的緩存,為驅(qū)動空間和用戶空間緩存間的映射做好準(zhǔn)備。
5)調(diào)用mmap(NULL,buffer.length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,buffer.m.offset)完成上一步的映射工作。
6)調(diào)用(ioctl(fd,VIDIOC_QBUF,&buf)將用戶空間申請到的緩存全部入隊(duì)列,以便存放采集到的數(shù)據(jù),然后調(diào)用ioctl(fd,VIDIOC_STREAMON,&type)開始圖像采集。
7)調(diào)用(ioctl(fd,VIDIOC_DQBUF,&buf)取得已采集數(shù)據(jù)的緩存,此時得到的是原始采集數(shù)據(jù)。
8)如需循環(huán)采集圖像,則將已經(jīng)采集到數(shù)據(jù)的緩存重新入隊(duì)列尾,以重新利用申請到的緩存。最后需要關(guān)閉視頻設(shè)備,解除內(nèi)存映射關(guān)系。
運(yùn)用圖像采集程序Color_image和Infra_image可以在CM-T3530分別獲得同一位置的紅外圖像和彩色圖像,兩種圖像各有可取之處。例如在火災(zāi)初步預(yù)警中可以利用紅外攝像頭連續(xù)圖像中包含的亮度信息的變化獲取熱點(diǎn)的坐標(biāo),而彩色圖像則具有更好的可視效果,但無法檢測圖像中的熱點(diǎn)。如果將紅外攝像頭采集檢測熱點(diǎn)進(jìn)程與彩色攝像頭采集圖像進(jìn)程之間運(yùn)用合適方式進(jìn)行通信,就可以在CM-T3530上得到包含熱點(diǎn)信息的彩色圖像。
Linux下常用的進(jìn)程通信手段是從UNIX平臺上的進(jìn)程通信手段繼承而來的,目前有管道、消息隊(duì)列、共享內(nèi)存和信號量等幾種手段。本系統(tǒng)采用的是系統(tǒng)V共享內(nèi)存,它首先把所有共享數(shù)據(jù)放在共享內(nèi)存區(qū)域(IPC shared memory region),然后需要訪問數(shù)據(jù)的進(jìn)程在自己的地址空間新增一塊內(nèi)存區(qū)域以映射共享內(nèi)存區(qū)域,從而也就可以讀寫共享數(shù)據(jù)。
在雙路圖像進(jìn)程中,需要首先分別調(diào)用shmget()來創(chuàng)建同一塊共享內(nèi)存,然后調(diào)用shmat()將共享內(nèi)存區(qū)對象映射到調(diào)用進(jìn)程的地址空間;此時紅外圖像進(jìn)程向該共享內(nèi)存中寫入熱點(diǎn)坐標(biāo),彩色圖像進(jìn)程從該共享內(nèi)存中讀出坐標(biāo)值并在圖像信息以圓標(biāo)識,即實(shí)現(xiàn)了進(jìn)程間的實(shí)時通信。具體實(shí)現(xiàn)為首先在Color_image和Infra_image中分別利用語句
創(chuàng)建同一塊共享內(nèi)存,并且分別利用語句
將共享內(nèi)存區(qū)映射到各自進(jìn)程的地址空間。然后在進(jìn)程Infra_image通過賦值語句*shmptr_x=X和*shmptr_y=Y將其檢測到的熱點(diǎn)坐標(biāo)(X,Y)寫入到共享內(nèi)存中,此時區(qū)域shmptr_x和shmptr_y的值即為熱點(diǎn)坐標(biāo)。而進(jìn)程Color_image利用賦值語句a=*shmptr_x和b=*shmptr_y取得熱點(diǎn)坐標(biāo)(a,b)。
然后在兩進(jìn)程中均運(yùn)用cvCircle函數(shù)在熱點(diǎn)的范圍處用圓標(biāo)識,接下來就是兩路圖像的傳輸。
以上圖像的采集、進(jìn)程間的通信都是在CM-T3530核心板上完成的,此時得到的兩路圖像信息可通過核心板內(nèi)置的WiFi接口傳到遠(yuǎn)程計算機(jī)上顯示。Socket接口作為一種文件描述符其實(shí)就是一種特殊的I/O,首先通過類似于打開文件的函數(shù)調(diào)用可以得到一個整型的Socket描述符,隨后的建立連接、傳輸數(shù)據(jù)等操作都是通過該整型描述符來進(jìn)行的。運(yùn)用Socket接口傳輸信息時,需要首先確定網(wǎng)絡(luò)傳輸協(xié)議,比較常用的有TCP和UDP,這里運(yùn)用UDP協(xié)議。
CM-T3530作為客戶機(jī)端,向PC發(fā)送圖像信息;PC作為服務(wù)器端,接收核心板發(fā)送的圖像信息并顯示出圖像。以彩色圖像的傳輸為例,CM-T3530上的Color_image首先創(chuàng)建一個基于UDP協(xié)議的套接字,它不需要和服務(wù)器建立連接,但是在發(fā)送圖像數(shù)據(jù)時需指明服務(wù)器即PC的IP地址,這樣就可以將圖像數(shù)據(jù)發(fā)送過去。而PC上Color_show進(jìn)程也要首先建立一個基于UDP協(xié)議的套接字,然后將該套接字和PC的IP綁定在一起以接收圖像信息,最后調(diào)用Cvshowimage函數(shù)顯示剛剛接收的一幀圖像。其程序流程圖及函數(shù)調(diào)用如圖4所示。
圖4 Socket傳輸流程圖
測試?yán)胕octl(fd,VIDIOC_S_FMT,& fmt)函數(shù)將兩路圖像的像素值設(shè)為160×120,利用cvCircle函數(shù)將兩路圖像中的熱點(diǎn)用圓標(biāo)出。測試時在CM-T3530的終端里運(yùn)行Color_image和Infra_image兩個程序,在PC的終端里運(yùn)行Color_show和Infra_show程序以接收并顯示圖像,最后同時截取PC上兩路圖像的其中一幀,如圖5所示。
圖5中左邊圖像為紅外圖像,它準(zhǔn)確地檢測出圖像中裝有熱水的杯子并用圓將熱點(diǎn)標(biāo)出;同時紅外圖像將檢測出的熱點(diǎn)位置信息通過進(jìn)程間通信傳遞給彩色圖像即圖5中右邊圖像,這樣就可以通過清晰的彩色圖像準(zhǔn)備地判斷出拍攝場景中熱點(diǎn)的位置。另外在程序中可利用函數(shù)gettimeofday(&tpstart,NULL)來獲得采集傳輸若干幀圖像時所用到的時間,從而可進(jìn)一步得知兩路圖像的延遲時間和傳輸幀率。本次測試中PC上圖像較真實(shí)場景的延遲時間為200 ms,即當(dāng)熱點(diǎn)發(fā)生移動時,200 ms后會在PC上顯示出來,此時傳輸速度達(dá)到28 f/s。
如果改變圖像的像素值,則圖像的延遲時間和傳輸速度都會受到影響。這是因?yàn)閂4L2采集圖像時采用V4L2_PIX_FMT_YUYV 格式(YUV4∶2∶2),也即每 4 byte代表2個像素。所以當(dāng)圖像的像素值增大時,每幀圖像所占用的字節(jié)數(shù)也會增大,則利用Socket傳輸一幀圖像時所需要的傳輸次數(shù)會相應(yīng)增大,導(dǎo)致延遲時間變大,傳輸速度也會變小。表1反映了改變雙路圖像的像素值時延遲時間和傳輸速度的變化,可以根據(jù)這些測試來選取合適的像素值,以獲得合適的圖像清晰程度和較好的畫面實(shí)時性。
表1 傳輸效果測試
本文提出了基于CM-T3530核心板和Linux操作系統(tǒng)的嵌入式雙路圖像的采集與傳輸方案。系統(tǒng)采用Linux自帶的V4L2視頻編程接口,由于它不依賴于硬件所以可移植性較強(qiáng),只需在宿主機(jī)上進(jìn)行交叉編譯即可移植到目標(biāo)板上進(jìn)行圖像的采集傳輸?shù)取?梢愿鶕?jù)系統(tǒng)的搭建目的對兩路圖像分別進(jìn)行圖像處理,并利用進(jìn)程通信將兩者優(yōu)勢結(jié)合,此系統(tǒng)可廣泛應(yīng)用于嵌入式圖像處理領(lǐng)域。本文詳細(xì)說明了該系統(tǒng)的搭建過程并對系統(tǒng)進(jìn)行反復(fù)測試,可根據(jù)測試結(jié)果進(jìn)一步對其優(yōu)化,以達(dá)到更好的效果。
[1]華清遠(yuǎn)見嵌入式培訓(xùn)中心.嵌入式Linux系統(tǒng)開發(fā)[M].北京:人民郵電出版社,2009.
[2]張雷,溫秀紅.基于USB接口的視頻圖像采集系統(tǒng)設(shè)計[J].電視技術(shù),2004,28(2):60-61.
[3]林文森,李鐘慎,洪健.基于ARM嵌入式圖像處理系統(tǒng)設(shè)計與實(shí)現(xiàn)[J].福州大學(xué)學(xué)報:自然科學(xué)版,2008(9):13-16.
[4]陳亮.基于Video4Linux2的圖像采集程序設(shè)計[J].微計算機(jī)信息,2009(7):65-67.
[5]宋凱,嚴(yán)麗平,甘嵐.嵌入式圖像處理系統(tǒng)的設(shè)計與實(shí)現(xiàn)[J].計算機(jī)工程與設(shè)計,2009,30(19):4368-4370.
[6]STEVENS W R,RAGO S A.UNIX 環(huán)境高級編程[M].2版.尤晉元,張亞英,戚正偉,譯.北京:人民郵電出版社,2006.