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