导言
据媒体报道,我国因为后视镜盲区构成的交通事故约占30%.而且,跟着“考驾照”热不降温的现象呈现,未来的轿车后视镜盲区问题更是不容小觑。数字社会的构成为数字化实时监控供给了关键,轿车后视场景的数字化实时监控成为处理后视镜盲区问题的研讨热门。
现在,市场上现已呈现了一些数字化的轿车监控体系,常见的有分屏显现的监控体系、有缝拼接的监控体系和第8代“卫星”全景行车安全体系。分屏显现的监控体系仅仅对图画进行简略的分屏显现,不能实时地将车辆周围的现象显现在屏幕上;有缝拼接的监控体系不是将图画简略地叠加,而是对图画拼接处理,构成中心是车子,周围是图画的全景图,缺陷在于四个图画拼接之处存在显着的拼接缝;第8代“卫星”全景行车安全体系选用超广角摄像头,它能够更好地消除图画拼接之处的拼接缝,构成轿车全景俯视图。
Android体系具有渠道敞开性,而且谷歌的“敞开轿车联盟(OAA)”致力于完结轿车与Android设备的无缝衔接以及直接在轿车上内置Android车载体系;DM3730
集成了1GHz的ARM Cortex-A8核和800MHz的TMS320C64x+ DSP核,DSP在数字信号处理上具有无与伦比的优势,更适合进行图画处理。因而,依据Android和DM3730规划的车载分布式视频监控体系有着宽广的运用远景。
车载分布式视频监控体系集成了Android渠道的敞开性、ARM+DSP的高功用、以太网的可扩展性和USB摄像头的即插即用性,对完结轿车数字化实时监控有研讨含义和运用价值。
1体系的全体规划
车载分布式视频监控体系由视频收集模块、视频传输模块、视频拼接模块和视频显现模块四个模块组成。图1展现了体系的全体规划,图2展现了体系各模块之间的硬件接口。
图1车载分布式视频监控体系全体规划示意图
图2车载分布式视频监控体系硬件接口框图
①视频收集模块:AM3715开发板通过USB-HOST接口外接USB摄像头,通过Android操作体系的Java本地调用接口[3](JNI)和V4L2 (video 4 linux 2)视频驱动结构实时收集视频并显现。
②视频传输模块:两个(或多个)AM3715和DM3730开发板之间通过以太网相连,运用RTP组播协议和自界说同步机制将USB摄像头收集的图画实时传输至DM3730开发板的ARM端。
③视频拼接模块:DM3730开发板的ARM端运转嵌入式Linux操作体系(或Android操作体系),通过TI Codec Engine模块一起在ARM端和DSP端映射同享内存,使得同步接纳的两幅(或多幅)图画能够被ARM和DSP一起拜访。针对车载运用扩大嵌入式核算视觉库(EMCV),并移植和优化SURF开源项目OpenSURF,DSP端能够实时拼接两幅(或多幅)图画,终究将拼接成果由同享内存回来ARM端。
④视频显现模块:视频显现是通过跨渠道多媒体库SDL(Simple DirectMedia Layer)来完结的。其间,AM3715开发板显现别离的USB摄像头图画,DM3730开发板显现拼接完结的图画。
2视频收集传输和显现
2.1 Android V4L2视频收集模块
V4L2从Linux 2.5.x版别的内核开端呈现,为使能UVC驱动和V4L2编程结构,首要需查看Android内核装备选项,以生成视频设备文件/dev/videoX(X表明次设备号)。
运用V4L2进行USB摄像头视频收集的流程[7]包含:(1)翻开视频设备文件;(2)查看设备特点;(3)设置视频格局;(4)帧缓冲区办理;(5)循环收集视频;(6)封闭视频设备。
V4L2介于运用程序和硬件设备之间,运用程序能够通过三种办法拜访内核层的数据:直接读/写办法、内存映射办法和用户指针办法。直接读/写办法需求在用户空间和内核空间不断复制数据,功率低下;内存映射办法把内核地址映射到用户地址空间,进程能够直接读写内存,避免了数据的复制,具有较高的功率;用户指针办法的内存片段是由运用程序自己分配的。
车载分布式视频监控体系选用功率较高的内存映射办法,体系调用mmap()能够将内核地址映射到用户地址空间。
2.2 RTP视频传输模块
鉴于以太网具有高速的传输才干和杰出的可扩展功用,车载分布式视频监控体系通过RTP组播的办法在Android体系与嵌入式Linux体系之间传输USB摄像头收集的图画。文献[8]描绘了运用RTP库JRTPLIB完结视频实时传输的进程。为了确保两个AM3715开发板与DM3730开发板之间图画传输的同步性,车载分布式视频监控体系规划了同步传输协议,协议描绘如下:
(1)发送端
①每个发送端等候来自接纳端的视频帧恳求指令‘R’,否则不履行发送操作。
②收到帧恳求指令后,发送端首要向组播地址发送视频帧传输开端标识0xFE,以标识一帧视频传输的开端。
③将YUY2格局的图画顺次向组播地址传输,每次传输m行,传输n次,并在每个RTP数据包的首字节方位增加RTP包传输序号(序号从0开端,顺次增1)。假定YUY2图画宽度为width,高度为height,因为均匀一个像素占2B,所以每次传输的RTP包数据巨细为(2m*width+1)B,传输次数n = height/m.
④传输完毕时,向组播地址发送视频帧传输完毕标识0xFF,以标志一帧视频传输的完毕。
(2)接纳端
①接纳端向组播地址发送帧恳求指令‘R’,然后发动软件电子狗,并处于堵塞等候状况。
②若软件电子狗计时完毕时仍未被喂狗,阐明网络通讯呈现毛病,从头向组播地址发送帧恳求指令‘R’,并重启软件电子狗。
③顺次接纳来自每个发送端的RTP数据包,并依据IP地址和RTP包传输序号复原每帧视频,直至收到视频帧传输完毕标识0xFF.
2.3 SDL视频显现模块
YUV格局在存储办法上分为打包格局(Packed Format)和平面格局(Planner Format),打包格局的Y、U、V三个重量接连穿插存储,而平面格局的Y、U、V三个重量分隔存储。试验中USB摄像头收集的图画格局是YUY2格局,而通过拼接完结的图画是YV12格局。YUY2格局是一种打包格局,以4:2:2办法打包,每个像素保存Y重量,而UV重量在水平方向上的采样率仅为Y重量的1/2,即存储次序为[Y0 U0 Y1 V0] [Y2 U2 Y3 V2]……[Y2n U2n Y2n+1 V2n].YV12是一种平面格局,UV重量在水平方向和笔直方向上的采样率均为Y重量的1/2.特别地,YV12格局在UV提取时,需先将图画划分为若干个2 x 2的方阵,然后在每个方阵上提取一个U重量和一个V重量。例如,关于6×4的图画,YV12的采样办法如下图所示,其存储次序为[Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15 Y16 Y17 Y18 Y19 Y20 Y21 Y22 Y23] [U0 U1 U2 U3 U4 U5] [V0 V1 V2 V3 V4 V5 V6].
YV12采样办法示意图
SDL支撑FrameBuffer,运用SDL能够在Android和Linux上直接显现YUY2和YV12格局的图画,不需求通过YUV格局到RGB格局的转化。不同的是,规范Linux的FrameBuffer设备文件为/dev/fb0,而Android Linux的FrameBuffer设备文件是/dev/graphics/fb0.运用SDL显现YUV格局图画的流程包含:(1)初始化视频设备;(2)设置视频显现方式;(3)创立YUV覆盖层;(4)轮询事情处理;(5)制作YUV覆盖层;(6)显现YUV覆盖层;(7)开释YUV覆盖层;(8)退出SDL.
3 ARM+DSP双核视频拼接模块
3.1 Codec Engine双核通讯规划
Codec Engine是ARM和DSP通讯的桥梁,选用远程进程调用(RPC)的思维。ARM端作为客户端,DSP端作为服务器端,ARM和DSP之间的通讯链路是同享内存,通讯协议是DSP Link.Codec Engine有专门的内存办理驱动CMEM来办理ARM和DSP之间的同享内存,CMEM以内存池或内存堆的办法办理一个或许多个接连的物理块内存并供给地址转化(虚拟地址和物理地址之间的转化)功用。
Codec Engine有中心引擎接口和VISA接口。中心引擎接口包含引擎的初始化接口、引擎运转状况的操控接口和内存的体系笼统层接口;VISA接口包含视频编/解码接口、音频编/解码接口、图画编/解码接口和语音编/解码接口。VISA接口的运用分为VISA创立、VISA操控、VISA处理和VISA删去四部分,图3展现了通过VISA操控/处理的流程。
图3 VISA操控/处理示意图
Codec Engine的运用分为创立运用程序、完结Codec算法和集成Codec Server三部分。运用程序运转在ARM端,通过调用中心引擎接口和VISA接口与DSP进行通讯;关于契合XDM(eXpressDSP Digital Media)规范的Codec算法,Codec Engine的VISA接口不需求附加条件就能支撑远端运转,关于契合XDAIS(eXpressDSP Algorithm Interface Standard)规范的非XDM算法,有必要供给Codec Engine的存根和骨架中心件才干支撑远端运转;Codec Server运转在DSP端,担任办理调度不同的Codec算法。
车载分布式视频监控体系接纳端运用视频编码接口(VIDENC_)完结ARM端调用DSP端依据SURF的图画拼接算法。运用程序的履行流程如图4所示。
图4车载分布式视频监控体系接纳端运用程序流程图
3.2依据SURF的视频拼接
体系选用SURF算法检测特征点和描绘特征点。SURF具有规范和旋转不变性,对光照和角度改换具有不错的鲁棒性,而且通过优化后能够满意实时性要求。依据特征点之间的欧氏间隔进行粗匹配,运用RANSAC(随机一致性)办法去除错匹配点,核算图画之间的透视改换矩阵,终究选用渐入渐出均匀法交融图画。
针对本体系,能够对算法进行进一步的优化,进步体系的实时性。因为体系中摄像头的方位相对固定,因而能够预先核算图画之间的堆叠方位,不需检测彻底没有图画堆叠的区域;一起,因为摄像头相对方位不变,图画之间的透视改变矩阵不会改变,因而能够只核算一次透视改变矩阵,后续拼接运用第一次的透视改变矩阵,可进一步进步实时性。
(1)SURF特征点检测
SURF特征点检测是在规范空间中进行的,并运用Hessian矩阵行列式值检测特征点,规范为σ的点X(x,y)的Hessian矩阵H(X,σ)界说如式(3-1),其间Lxx (X,σ),Lxy (X,σ),Lyy (X,σ)为在规范σ下的高斯函数的二阶偏导数在图画点X处的卷积。
SURF运用依据积分图的盒型滤波器(box filter)近似此高斯卷积进程,图3-2所示为9*9盒型滤波器对分别对x,y,xy方向的二维高斯滤波的近似。通过近似,将在点X(x,y)的二维高斯卷积转化为对其周围的加权核算进程,在此加权核算进程中,运用积分图核算图3-2中黑色矩形区域和白色矩形区域灰度值之和,将高斯滤波中的很多的乘法运算转化为简略的加减运算。
设对x,y,xy方向的二维高斯卷积的近似分别用Dxx,Dyy,Dxy表明,则能够通过式(3-2)近似Hessian矩阵H(X,σ)行列式值,其间w一般取0.9。当Det(H(X,σ))>0时,Dxx>0时,点X(x,y)为部分极小值点;Dxx0时,X(x,y)为部分极大值点。找到极值点后,在3×3×3空间中判断点X(x,y)是否比它周围的26个点都大或许小,如果是,则该点被视作候选特征点,然后对候选特征点在规范空间中进行亚像素级插值,得到特征点的坐标。
图3-2 9×9的x方向,y方向,xy方向盒型滤波器
Det(H(X,σ))≈Dxx*Dyy-(w*Dxy)2 (3-2)
(2)SURF特征点描绘
特征点描绘首要分两步:第一步是获取特征点的主方向,首要意图是为了确保旋转不变性。第二步是生成64维的特征点描绘符,首要意图是描绘特征点的特征。
为了获取特征点的主方向,核算以特征点为中心,半径为6σ(σ为特征点地点的规范)内的一切点在x,y方向的Harr小波呼应。并选取一个巨细为60度的扇形窗口旋转整个圆形区域,将窗口内一切x,y方向的呼应值相加得到一个新矢量,终究以最长的矢量地点的方向作为特征点的主方向。
特征点描绘需求将坐标轴旋转到主方向上,并将以特征点为中心的边长为20σ的区域划分为4×4个子窗口,每个子窗口分为5×5个采样点,核算每个采样点的沿主方向和笔直主方向的Harr小波呼应,记为d_x和d_y,终究生成一个4维矢量v=(∑dx,∑dy ,∑|dx|,∑|dy|),并将其归一化。一共4×4个子窗口,生成64维的描绘符。
3.3 SURF在DM3730上的移植和优化
(1)SURF的移植
SURF算法完结依据OpenCV1.0,OpenCV库针对x86架构作了许多优化,在DSP上的履行功率难以得到确保。EMCV是一个可运转在DSP上的OpenCV库,但只完结了部分OpenCV的数据结构和库函数。因而,车载分布式视频监控体系需求扩大EMCV库,以支撑SURF在DM3730上的运转。扩大的库函数包含:cvAdd、cvAddWeighted、cvConvertScale、cvCvtColor、cvGEMM、cvInvert、cvMerge、cvResetImageROI、cvResize、cvSVD、cvSetImageROI、cvSplit、cvWarpPerspective.
为了便于EMCV库的扩大和优化,EMCV库通过CCS(Code Composer Studio)软件以lib静态库的方式供给给Codec算法运用,如下所示:
[package.bld]
packageti.sdo.ce.examples.codecs.videnc_mosaic.emcv{
}
[package.xs]
functiongetLibs(prog){
var name = null;
if (prog.build.target.isa == 64P) {
var name = emcv.lib;
print( will link with + this.$name + : + name);
}
return (name);
}
此外,为了消除SURF对C++规范模板库的依靠,车载分布式视频监控体系规划了专门的容器结构和相应的操作,首要代码如下:
typedefstruct _Vector{
void *pdata; //数据块首地址
int count; //数据块元素数目
int size; //数据块已用巨细
int totalSize; //数据块总巨细
}Vector;
#define PRE_CALLOC_SIZE 20 //预分配元素个数
/*增加nElem个元素,每个元素巨细elSize */
intvector_pushback( Vector *pVector, intnElem, intelSize ){
int n = nElem> PRE_CALLOC_SIZE? nElem:PRE_CALLOC_SIZE;
if(pVector->size + nElem*elSizetotalSize ){
pVector->size += nElem*elSize;
pVector->count += nElem;
return 0;
}else{ //预分配的内存不足,需从头分配内存
pVector->totalSize += n*elSize;
void *pNewData = (void*)realloc( pVector->pdata, pVector->totalSize );
if(pNewData ){
pVector->pdata = pNewData;
pVector->size += nElem*elSize;
pVector->count += nElem;
return 0;
}else{ //内存分配失利
return -1;
}
}
}
/*毁掉容器,开释内存*/
voidvector_destroy( Vector*pVector ){
if(pVector->pdata ){
free(pVector->pdata );
pVector->pdata = NULL;
}
pVector->size = pVector->count = pVector->totalSize = 0;
}
(2)SURF在DM3730上的优化
SURF在DM3730上的优化分为项目级优化、指令级优化和缓存优化三个方面。项目级优化是通过合理地挑选和装备相关的编译器优化选项,首要包含:调试方式选项(Debugging Model)、优化等级选项(opt_level)、代码巨细选项(opt_for_sapce)、代码速度选项(opt_for_speed)、程序级优化(-op)等。为了最大极限地进步代码的履行功率,车载分布式视频监控体系挑选的编译器优化选项为-o3、-ms0、-mf5、-op2、-mt、-mh、-mw.指令级优化包含挑选适宜的数据类型,消除指令和数据之间的相关性,运用内联(intrinsic)函数以及改进软件流水等。缓存优化是将CPU近期拜访过的数据或许程序放置在Cache中,以进步CPU的履行速度。
4测验成果及剖析
图6展现了车载分布式视频监控体系的拼接作用,表1比较了SURF和SIFT算法在DM3730和PC机上的拼接功率。从拼接作用能够看出,车载分布式视频监控体系能习惯图画的平移、旋转和缩放等特性。图6中的两幅待拼接的图画存在显着的旋转特性,而且拼接完结的图画有必定的缩放作用。从表1中能够看出,车载分布式视频监控体系在视频收集、视频传输和视频显现上总耗时约为257ms,远远小于视频拼接所需时刻3264ms.这是因为视频拼接模块运用了许多EMCV和OpenCV库函数,它们在DM3730处理器上还有待进一步被优化。作为SIFT算法的加快版,SURF算法的履行功率要远远大于SIFT算法的履行功率。从本次测验成果看,在DM3730上,SURF算法的履行功率是SIFT算法履行功率的3.68倍左右;而在以Intel Core2 Duo T5870为处理器的PC机上,SURF算法的履行功率是SIFT算法履行功率的1.40倍左右。
在摄像头相对方位固定情况下,图画之间的透视改变矩阵固定,因而只需核算一次透视改变矩阵,后续的图画拼接只需进行图画配准和交融。表2中列出了DM3730上SURF算法的时刻组成,其间SURF算法透视改换矩阵核算时刻占95%以上,实践的图画拼接时刻为图画配准和怎么时刻,均匀时刻约为66ms.
图6 车载分布式视频监控成果的拼接作用
表1 SURF和SIFT算法比较
表2 DM3730上SURF拼接时刻组成
结语
本文从视频收集、视频传输、视频拼接和视频显现等四个方面具体论述了依据Android和DM3730的轿车分布式视频监控体系的规划原理和优势。从测验成果看,车载分布式视频监控体系基本上能到达实时收集、实时传输、实时显现,通过优化后,图画拼接的功率基本能满意实时性要求,但体系全体功用还有待进步,能够选用多核处理器替代单核处理器,进一步进步体系的实时性。