曾禮,馬忠梅,劉佳偉,趙旭強(qiáng)
(北京理工大學(xué) 計(jì)算機(jī)學(xué)院,北京100081)
據(jù)報(bào)道,我國(guó)由于后視鏡盲區(qū)造成的交通事故約占30%。目前,市場(chǎng)上已經(jīng)出現(xiàn)了一些數(shù)字化的汽車監(jiān)控系統(tǒng),常見(jiàn)的有分屏顯示監(jiān)控系統(tǒng)、有縫拼接監(jiān)控系統(tǒng)和第8代“衛(wèi)星”全景行車安全系統(tǒng)。分屏顯示監(jiān)控系統(tǒng)只是對(duì)圖像進(jìn)行簡(jiǎn)單的分屏顯示,不能實(shí)時(shí)地將車輛周圍的景象顯示在屏幕上;有縫拼接監(jiān)控系統(tǒng)不是將圖像簡(jiǎn)單地疊加,而是對(duì)圖像拼接處理,形成中間是汽車,周圍是圖像的全景圖,缺點(diǎn)在于4個(gè)圖像拼接之處存在明顯的拼接縫;第8代“衛(wèi)星”全景行車安全系統(tǒng)采用超廣角攝像頭,能夠很好地消除圖像拼接之處的拼接縫,形成汽車全景俯視圖。
Android系統(tǒng)具有平臺(tái)開(kāi)放性,而且谷歌的“開(kāi)放汽車聯(lián)盟(OAA)”[1]致力于實(shí)現(xiàn)汽車與Android設(shè)備的無(wú)縫連接以及直接在汽車上內(nèi)置Android車載系統(tǒng);DM3730[2]集成了1 GHz的 ARM Cortex-A8內(nèi)核和800 MHz的TMS320C64x+DSP內(nèi)核。因此,基于Android和DM3730設(shè)計(jì)的車載分布式視頻監(jiān)控系統(tǒng)有著廣闊的應(yīng)用前景。
車載分布式視頻監(jiān)控系統(tǒng)由視頻采集模塊、視頻傳輸模塊、視頻拼接模塊和視頻顯示模塊4個(gè)模塊組成。系統(tǒng)的整體設(shè)計(jì)示意圖如圖1所示。系統(tǒng)各模塊之間的硬件接口框圖如圖2所示。
圖1 車載分布式視頻監(jiān)控系統(tǒng)整體設(shè)計(jì)示意圖
①視頻采集模塊:AM3715開(kāi)發(fā)板通過(guò)USB-HOST接口外接USB攝像頭,用Android操作系統(tǒng)的Java本地調(diào)用接口[3](JNI)和 V4L2(Video 4 Linux 2)視頻驅(qū)動(dòng)框架實(shí)時(shí)采集視頻并顯示。
圖2 系統(tǒng)各模塊之間硬件接口框圖
②視頻傳輸模塊:兩個(gè)(或多個(gè))AM3715和DM3730開(kāi)發(fā)板之間通過(guò)以太網(wǎng)相連,利用RTP組播協(xié)議和自定義同步機(jī)制將USB攝像頭采集的圖像實(shí)時(shí)傳輸至DM3730開(kāi)發(fā)板的ARM端。
③視頻拼接模塊:DM3730開(kāi)發(fā)板的ARM端運(yùn)行嵌入式Linux(或Android)操作系統(tǒng),通過(guò)TI公司提供的Codec Engine模塊同時(shí)在ARM端和DSP端映射共享內(nèi)存,使同步接收的兩幅(或多幅)圖像能夠被ARM和DSP同時(shí)訪問(wèn)[4]。針對(duì)車載應(yīng)用擴(kuò)充嵌入式計(jì)算視覺(jué)庫(kù)[5](EMCV),并移植和優(yōu)化SURF開(kāi)源項(xiàng)目 OpenSURF[6],DSP端能夠?qū)崟r(shí)拼接兩幅(或多幅)圖像,最后將拼接結(jié)果由共享內(nèi)存返回ARM端。
④視頻顯示模塊:視頻顯示是通過(guò)跨平臺(tái)多媒體庫(kù)SDL(Simple Direct Media Layer)來(lái) 完 成 的。其 中,AM3715開(kāi)發(fā)板顯示分離的USB攝像頭圖像,DM3730開(kāi)發(fā)板LCD屏顯示拼接完成的圖像。
V4L2從Linux 2.5.x版本的內(nèi)核開(kāi)始出現(xiàn),利用V4L2進(jìn)行USB攝像頭視頻采集的流程[7]包括:①打開(kāi)視頻設(shè)備文件;②檢查設(shè)備屬性;③設(shè)置視頻格式;④幀緩沖區(qū)管理;⑤循環(huán)采集視頻;⑥關(guān)閉視頻設(shè)備。
V4L2介于應(yīng)用程序和硬件設(shè)備之間,應(yīng)用程序可以通過(guò)3種方式訪問(wèn)內(nèi)核層的數(shù)據(jù):直接讀/寫方式、內(nèi)存映射方式和用戶指針?lè)绞健V苯幼x/寫方式需要在用戶空間和內(nèi)核空間不斷拷貝數(shù)據(jù),效率低下;內(nèi)存映射方式將內(nèi)核地址映射到用戶地址空間,進(jìn)程可以直接讀寫內(nèi)存,避免了數(shù)據(jù)的拷貝,具有較高的效率;用戶指針?lè)绞降膬?nèi)存片段是由應(yīng)用程序自己分配的。車載分布式視頻監(jiān)控系統(tǒng)采用效率較高的內(nèi)存映射方式。
鑒于以太網(wǎng)具有高速的傳輸能力和良好的可擴(kuò)展性能,車載分布式視頻監(jiān)控系統(tǒng)通過(guò)RTP組播的方式在Android系統(tǒng)與嵌入式Linux系統(tǒng)之間傳輸U(kuò)SB攝像頭采集的圖像。參考文獻(xiàn)[7]描述了利用RTP庫(kù)JRTPLIB實(shí)現(xiàn)視頻實(shí)時(shí)傳輸?shù)倪^(guò)程。為了確保兩個(gè)AM3715開(kāi)發(fā)板與DM3730開(kāi)發(fā)板之間圖像傳輸?shù)耐叫?,車載分布式視頻監(jiān)控系統(tǒng)設(shè)計(jì)了同步傳輸協(xié)議,協(xié)議描述如下:
(1)發(fā)送端
①每個(gè)發(fā)送端等待來(lái)自接收端的視頻幀請(qǐng)求命令“R”,否則不執(zhí)行發(fā)送操作。
②收到幀請(qǐng)求命令后,發(fā)送端首先向組播地址發(fā)送視頻幀傳輸開(kāi)始標(biāo)識(shí)0x FE,以標(biāo)識(shí)一幀視頻傳輸?shù)拈_(kāi)始。
③將YUY2格式的圖像依次向組播地址傳輸,每次傳輸m行,傳輸n次,并在每個(gè)RTP數(shù)據(jù)包的首字節(jié)位置添加RTP包傳輸序號(hào)(序號(hào)從0開(kāi)始,依次增1)。假設(shè)YUY2圖像寬度為width,高度為height,由于平均一個(gè)像素占2字節(jié),所以每次傳輸?shù)腞TP包數(shù)據(jù)大小為(2m×width+1)B,傳輸次數(shù)n=height/m。
④傳輸結(jié)束時(shí),向組播地址發(fā)送視頻幀傳輸結(jié)束標(biāo)識(shí)0x FF,以標(biāo)志一幀視頻傳輸?shù)慕Y(jié)束。
(2)接收端
①接收端向組播地址發(fā)送幀請(qǐng)求命令“R”,然后啟動(dòng)軟件電子狗,并處于阻塞等待狀態(tài)。
②若軟件電子狗計(jì)時(shí)結(jié)束時(shí)仍未被喂狗,說(shuō)明網(wǎng)絡(luò)通信出現(xiàn)故障,則重新向組播地址發(fā)送幀請(qǐng)求命令“R”,并重啟軟件電子狗。
③依次接收來(lái)自每個(gè)發(fā)送端的RTP數(shù)據(jù)包,并根據(jù)IP地址和RTP包傳輸序號(hào)還原每幀視頻,直至收到視頻幀傳輸結(jié)束標(biāo)識(shí)0x FF。
YUV格式在存儲(chǔ)方式上分為打包格式(Packed Format)和平面格式(Planner Format),打包格式的 Y、U、V三個(gè)分量連續(xù)交叉存儲(chǔ),而平面格式的Y、U、V三個(gè)分量分開(kāi)存儲(chǔ)。實(shí)驗(yàn)中USB攝像頭采集的圖像格式是YUY2格式,而經(jīng)過(guò)拼接完成的圖像是YV12格式。YUY2格式是一種打包格式,以4∶2∶2方式打包,每個(gè)像素保留Y分量,而UV分量在水平方向上的采樣率僅為Y分量的1/2,即存儲(chǔ)順序?yàn)閇Y0U0Y1V0][Y2U2Y3V2]……[Y2nU2nY2n+1V2n]。YV12是一種平面格式,UV 分量在水平方向和垂直方向上的采樣率均為Y分量的1/2。特殊地,YV12格式在UV提取時(shí),需先將圖像劃分為若干個(gè)2×2的方陣,然后在每個(gè)方陣上提取一個(gè)U分量和一個(gè)V分量。例如,對(duì)于6×4的圖像,YV12的采樣方式如圖3所示,其存儲(chǔ)順序?yàn)閇Y0Y1Y2Y3Y4Y5Y6Y7Y8Y9Y10Y11Y12Y13Y14Y15Y16Y17Y18Y19Y20Y21Y22Y23][U0U1U2U3U4U5][V0V1V2V3V4V5]。
SDL支持Frame-Buffer,利用SDL可以在Android和Linux上直接顯示YUY2和YV12格式的圖像,不需要經(jīng)過(guò)YUV到RGB格式的轉(zhuǎn)換。不同的是,標(biāo)準(zhǔn)Linux的Frame-Buffer設(shè)備文件為/dev/fb0,而 Android Linux的Frame-Buffer設(shè) 備 文 件 是/dev/graphics/fb0。 利 用 SDL 顯 示YUV格式圖像的流程包括:①初始化視頻設(shè)備;②設(shè)置視頻顯示模式;③創(chuàng)建YUV覆蓋層;④輪詢事件處理;⑤繪制YUV覆蓋層;⑥顯示YUV覆蓋層;⑦釋放YUV覆蓋層;⑧退出SDL。
圖3 YV12采樣方式示意圖
Codec Engine是ARM和DSP通信的橋梁,采用遠(yuǎn)程過(guò)程調(diào)用(RPC)的思想。ARM端作為客戶端,DSP端作為服務(wù)器端,ARM和DSP之間的通信鏈路是共享內(nèi)存,通信協(xié)議是DSP Link。Codec Engine有專門的內(nèi)存管理驅(qū)動(dòng)CMEM來(lái)管理ARM和DSP之間的共享內(nèi)存,CMEM以內(nèi)存池或內(nèi)存堆的方式管理一個(gè)或者多個(gè)連續(xù)的物理塊內(nèi)存,并提供地址轉(zhuǎn)換(虛擬地址和物理地址之間的轉(zhuǎn)換)功能。
Codec Engine有核心引擎接口和VISA接口。核心引擎接口包括引擎的初始化接口、引擎運(yùn)行狀態(tài)的控制接口和內(nèi)存的系統(tǒng)抽象層接口;VISA接口包括視頻編/解碼接口、音頻編/解碼接口、圖像編/解碼接口和語(yǔ)音編/解碼接口。VISA接口的使用分為VISA創(chuàng)建、VISA控制、VISA處理和VISA刪除4部分,通過(guò)VISA控制/處理的流程略——編者注。
Codec Engine的使用分為創(chuàng)建應(yīng)用程序、實(shí)現(xiàn)Codec算法和集成Codec Server三部分。應(yīng)用程序運(yùn)行在ARM端,通過(guò)調(diào)用核心引擎接口和VISA接口與DSP進(jìn)行通信;對(duì)于符合 XDM(eXpressDSP Digital Media)規(guī)范的Codec算法,Codec Engine的VISA接口不需要附加條件就能支持遠(yuǎn)端運(yùn)行,對(duì)于符合XDAIS(eXpressDSP Algorithm Interface Standard)規(guī)范的非XDM算法,必須提供Codec Engine的存根和骨架中間件才能支持遠(yuǎn)端運(yùn)行;Codec Server運(yùn)行在DSP端,負(fù)責(zé)管理調(diào)度不同的Codec算法。
車載分布式視頻監(jiān)控系統(tǒng)接收端使用視頻編碼接口(VIDENC_)實(shí)現(xiàn)ARM端調(diào)用DSP端基于SURF(Speeded-up Robust Features)的圖像拼接算法。應(yīng)用程序的執(zhí)行流程略——編者注。
系統(tǒng)采用SURF[7]算法檢測(cè)和描述特征點(diǎn)。針對(duì)本系統(tǒng),可以對(duì)算法進(jìn)一步優(yōu)化,提高系統(tǒng)的實(shí)時(shí)性。由于系統(tǒng)中攝像頭的位置相對(duì)固定,因而可以預(yù)先計(jì)算圖像之間的重疊位置,無(wú)需檢測(cè)完全沒(méi)有圖像重疊的區(qū)域;同時(shí),由于攝像頭相對(duì)位置不變,圖像之間的透視變化矩陣也不會(huì)變化,因此可以只計(jì)算一次透視變化矩陣,后續(xù)拼接使用第一次的透視變化矩陣,可進(jìn)一步提高實(shí)時(shí)性。
(1)SURF特征點(diǎn)檢測(cè)
SURF特征點(diǎn)檢測(cè)是在尺度空間中進(jìn)行的,使用Hessian矩陣行列式值檢測(cè)特征點(diǎn),尺度為σ的點(diǎn)X(x,y)的 Hessian矩陣 H(X,σ)定義為:
其中,Lxx(X,σ),Lxy(X,σ),Lyy(X,σ)為在尺度σ下的高斯函數(shù)的二階偏導(dǎo)數(shù)在圖像點(diǎn)X處的卷積。
SURF使用基于積分圖的盒型濾波器(box filter)近似此高斯卷積過(guò)程,圖4所示為9×9盒型濾波器分別對(duì)x,y,xy方向二維高斯濾波的近似。通過(guò)近似,將在點(diǎn)X(x,y)的二維高斯卷積轉(zhuǎn)化為對(duì)其周圍的加權(quán)計(jì)算過(guò)程,在此加權(quán)計(jì)算過(guò)程中,使用積分圖計(jì)算圖4中灰色矩形區(qū)域和白色矩形區(qū)域灰度值之和,將高斯濾波中大量的乘法運(yùn)算轉(zhuǎn)換為簡(jiǎn)單的加減運(yùn)算。
圖4 9×9的x方向,y方向,xy方向盒型濾波器
設(shè)對(duì)x,y,xy方向的二維高斯卷積的近似分別用Dxx,Dyy,Dxy表示,則可以通過(guò) Det(H(X,σ))≈Dxx×Dyy-(W×Dxy)2近似 Hessian矩陣 H(X,σ)行列式值,其中 W 通常取0.9。當(dāng)Det(H(X,σ))>0時(shí),Dxx>0,點(diǎn) X(x,y)為局部極小值點(diǎn);Dxx<0,X(x,y)為局部極大值點(diǎn)。找到極值點(diǎn)后,在3×3×3空間中判斷點(diǎn)X(x,y)是否比它周圍的26個(gè)點(diǎn)都大或者小。如果是,則該點(diǎn)被視作候選特征點(diǎn),然后對(duì)候選特征點(diǎn)在尺度空間中進(jìn)行亞像素級(jí)插值,得到特征點(diǎn)的坐標(biāo)。
(2)SURF特征點(diǎn)描述
特征點(diǎn)描述主要分兩步:第一步是獲取特征點(diǎn)的主方向,第二步是生成64維的特征點(diǎn)描述符。
為了獲取特征點(diǎn)的主方向,計(jì)算以特征點(diǎn)為中心,半徑為6σ(σ為特征點(diǎn)所在的尺度)內(nèi)的所有點(diǎn)在x,y方向的Harr小波響應(yīng)。選取一個(gè)大小為60°的扇形窗口旋轉(zhuǎn)整個(gè)圓形區(qū)域,將窗口內(nèi)所有x,y方向的響應(yīng)值相加得到一個(gè)新矢量,以最長(zhǎng)的矢量所在的方向作為特征點(diǎn)的主方向。
特征點(diǎn)描述需要將坐標(biāo)軸旋轉(zhuǎn)到主方向上,并將以特征點(diǎn)為中心的邊長(zhǎng)為20σ的區(qū)域劃分為4×4個(gè)子窗口,每個(gè)子窗口分為5×5個(gè)采樣點(diǎn),計(jì)算每個(gè)采樣點(diǎn)的沿主方向和垂直主方向的Harr小波響應(yīng),記為dx和dy,最終生成一個(gè)4維矢量v=(∑dx,∑dy,∑|dx|,∑|dy|),并將其歸一化??偣?×4個(gè)子窗口,生成64維的描述符。
(1)SURF的移植
SURF算法實(shí)現(xiàn)基于OpenCV1.0,OpenCV庫(kù)針對(duì)x86架構(gòu)作了許多優(yōu)化,但在DSP上的執(zhí)行效率難以得到保證。EMCV是一個(gè)可運(yùn)行在DSP上的OpenCV庫(kù),但只實(shí)現(xiàn)了部分OpenCV的數(shù)據(jù)結(jié)構(gòu)和庫(kù)函數(shù)。因此,車載分布式視頻監(jiān)控系統(tǒng)需要擴(kuò)充EMCV庫(kù),以支持SURF在DM3730上的運(yùn)行。擴(kuò)充的庫(kù)函數(shù)包括:cv Add、cv Add Weighted、cvConvertScale、cvCvtColor、cvGEMM、cvInvert、cv Merge、cvResetImageROI、cvResize、cvSVD、cvSetImageROI、cvSplit、cvWarpPerspective。為了便于 EMCV 庫(kù)的擴(kuò)充和優(yōu)化,EMCV庫(kù)通過(guò)CCS(Code Composer Studio)軟件以lib靜態(tài)庫(kù)的形式提供給Codec算法使用,程序略——編者注。
此外,為了消除SURF對(duì)C++標(biāo)準(zhǔn)模板庫(kù)的依賴,車載分布式視頻監(jiān)控系統(tǒng)設(shè)計(jì)了專門的容器結(jié)構(gòu)和相應(yīng)的操作,主要代碼略——編者注。
(2)SURF在DM3730上的優(yōu)化
SURF在DM3730上的優(yōu)化分為項(xiàng)目級(jí)優(yōu)化、指令級(jí)優(yōu)化和緩存優(yōu)化3個(gè)方面。項(xiàng)目級(jí)優(yōu)化是通過(guò)合理地選擇和配置相關(guān)的編譯器優(yōu)化選項(xiàng),主要包括:調(diào)試模式選項(xiàng)(Debugging Model)、優(yōu)化等級(jí)選項(xiàng)(opt_level)、代碼大小選項(xiàng)(opt_for_sapce)、代碼速度選項(xiàng)(opt_for_speed)、程序級(jí)優(yōu)化(-op)等。為了最大限度地提高代碼的執(zhí)行效率,車載分布式視頻監(jiān)控系統(tǒng)選擇的編譯器優(yōu)化選項(xiàng)為-o3、-ms0、-mf5、-op2、-mt、-mh、-mw。指令級(jí)優(yōu)化包括選擇合適的數(shù)據(jù)類型,消除指令和數(shù)據(jù)之間的相關(guān)性,使用內(nèi)聯(lián)(intrinsic)函數(shù)以及改善軟件流水等。緩存優(yōu)化是將CPU近期訪問(wèn)過(guò)的數(shù)據(jù)或者程序放置在Cache中,以提高CPU的執(zhí)行速度。
圖5展示了車載分布式視頻監(jiān)控系統(tǒng)的拼接效果,可以看出,圖中的兩幅待拼接的圖像存在明顯的旋轉(zhuǎn)特性,拼接完成的圖像有一定的縮放效果。
圖5 視頻監(jiān)控系統(tǒng)的拼接效果圖
從測(cè)試結(jié)果看,車載分布式視頻監(jiān)控系統(tǒng)基本能實(shí)現(xiàn)實(shí)時(shí)采集、實(shí)時(shí)傳輸、實(shí)時(shí)顯示,經(jīng)過(guò)優(yōu)化后,圖像拼接的效率基本能滿足實(shí)時(shí)性要求,但系統(tǒng)整體性能還有待提高。
編者注:本文為期刊縮略版,全文見(jiàn)本刊網(wǎng)站www.mesnet.com.cn。
[1]Google launches the Android-based Open Automotive Alliance with Audi,Honda,GM,and more[EB/OL].[2014-08].http://www.theverge. com/2014/1/6/5279116/googleopen-automotive-alliance-android-car-announcement.
[2]TI Instruments.DM3730,DM3725 Digital Media Processors[EB/OL].[2014-08].http://www.timll.com/chinese/uploadFile/TIOP/DM3730_Datasheet.pdf.
[3]Lee Y H,Chandrian P,Li B.Efficient Java NativeInterface for Android Based Mobile Devices[C]//Trust,Security and Privacy in Computing and Communications (TrustCom),2011 IEEE 10th International Conference on.IEEE,2011:1202-1209.
[4]龔澤摯,藍(lán)曉柯,鄭雅羽.基于Android和DM3730的視頻編碼軟件開(kāi)發(fā)[J].電視技術(shù),2013,37(17):76-79.
[5]胡楠.EMCV庫(kù)擴(kuò)充及車輛檢測(cè)系統(tǒng)的嵌入式實(shí)現(xiàn)[D].大連:大連海事大學(xué),2011.
[6]于海.OpenSURF在 TI DM642上的移植[J].電子科技,2012,25(5):133-136.
[7]王飛,孔聰.基于V4L2的Linux攝像頭驅(qū)動(dòng)的實(shí)現(xiàn)[J].電子科技,2012,25(2):86-87.
[8]趙學(xué)良.基于Android的流媒體引擎設(shè)計(jì)與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2012.
[9]Bay H,Tuytelaars T,Van Gool L.Surf:Speeded up robust features[M]//Computer Vision – ECCV 2006.Springer Berlin Heidelberg,2006:404-417.
[10]楊小輝,王敏.基于ASIFT的無(wú)縫圖像拼接方法[J].計(jì)算機(jī)工程,2013,39(2):241-244.
[11]劉旭.多圖像全景拼接技術(shù)研究[D].武漢:武漢理工大學(xué),2012.