潘安 李必军
摘要:开发基于Android智能手机的前方车辆检测系统。通过手机摄像头获取道路图像数据,利用JNI技术调用Android本地方法对图像数据进行处理并返回检测结果。为解决Android平台计算能力低、现有目标检测算法耗时久的问题,设计了一种车辆区域定位方法。首先利用车辆固有纹理特征对检测区域进行筛选,进一步利用聚类算法定位每一个车辆可能存在的区域。最后利用SVM分类器和HOG特征精确定位车辆外部轮廓,并剔除上一步中可能出现的错误聚类,最终实现手机平台上的前车实时检测。
关键词:Android平台;前车检测;JNI技术;辅助安全
DOIDOI:10.11907/rjdk.161110
中图分类号:TP319
文献标识码:A 文章编号:1672-7800(2016)005-0058-04
0 引言
随着全国私人轿车保有量的逐年上升,交通安全问题受到社会各方的广泛关注。越来越多汽车厂商、互联网公司开始着手进行车辆辅助安全方面的研究[1]。在车辆行驶过程中驾驶员受制于视角的限制,对行驶方向上的纵向距离不敏感,在跟车行驶时无法预留足够的安全距离,从而极易发生追尾、刮擦等事故。利用计算机视觉技术进行前方车辆检测并给出驾驶员预警信息能够在很大程度上避免交通事故的发生。同时,智能手机普及率高,在智能手机平台上开发前车检测预警系统具有极强的现实意义。
目前,计算机视觉领域常用的检测算法主要是从Harr特征的目标检测[2]以及HOG特征的目标检测[3]衍生而来。算法的运行环境通常是配备GPU的高性能PC机,其性能在手机平台上难以实现。李云种[4]、魏凯[5]等提出运用车辆底部阴影作为检测的辅助手段,通过对车辆底部阴影的检测找到合理的车辆感兴趣区域(ROI)以减少目标检测的运算量。但实际测试发现,车辆底部阴影作为单一特征其鲁棒性不强,容易受到树木、道路边界线的干扰。考虑到这些因素,本文设计了前车区域定位与最终检测相结合的程序处理算法。
1 系统技术方案
本系统在Android智能手机上运行,手机用支架固定在后视镜下方,相机镜头瞄准车辆的前进方向。系统运行中通过手机摄像头获取前方道路信息,定位视野前方的车辆并估算其相对于该车的位置,进一步根据危险性给出不同程度的危险预警。系统由3部分组成:Android前端模块、车辆检测模块、车辆决策模块,如图1所示。
1.1 Android前端
Android前端模块是实现与用户交互以及后台通信的平台,主要有三大功能:①负责驱动手机摄像头,使用Android API驱动相机并设置相机的对焦模式、图像尺寸并将抓取的每一帧数据存入缓存队列;②建立与本地方法的通信接口,将复杂的计算任务交由后台完成;③反馈结果,将车辆检测结果与相机获取的图像预览数据相叠加并通过SurfaceView显示。
1.2 车辆检测模块
车辆检测模块是系统的处理核心,运行在单一的工作线程。该模块从缓存队列中获取一帧图像,对图像做基本的预处理后进行车辆检测,检测结果作为跟踪决策模块的输入。
1.3 车辆决策模块
为了使检测结果更具有科学性,决策模块需要采用离线的方式构建行车安全模型。通过行车安全建模对检测结果进行评估并给出最终的驾驶建议。
2 算法设计
前车检测算法检测准确率的高低及速度快慢也是影响整个系统性能的关键。本文结合车辆辅助安全对算法实时性的高要求以及手机平台的特点,设计了前车区域定位与最终检测相结合的程序处理方式。
2.1 图像分割
在手机摄像头捕获的所有图像中,一半以上的区域是天空,而这部分区域对于前方车辆的检测不提供任何有效信息。此外,道路两旁的绿化带也占据图像很大比例,而且实际中道路边线外的区域会经常性地发生误检情况。
分水岭算法[6]是主流的图像分割算法之一,其基本思想是将图像中每一点像素的灰度值作为该点的海拔高度,每一个局部极小值及其影响区域被称为集水盆,而集水盆的边界则形成分水岭。将图像按照分水岭来划分可以很好地将图像中灰度值不同的区域进行分割。图2为采用分水岭算法进行分割后的效果,可以看到图像整体区域被分成了天空、绿化带、路面3个部分。
2.2 车辆区域定位
为进一步提高该模块运行效率,在图2路面区域进一步定位车辆大致范围。对车辆的粗定位可以利用其固有的纹理特征,测试发现除底部阴影外,后车窗、车牌、车顶、车辆下边缘等都具有较强的横向纹理,通过车辆横向纹理可以解决单一阴影带来的鲁棒性差的问题。图3中1、4区域,单一阴影受到道路边界干扰,结合车辆横向纹理后可以更好地定位图像2、3区域的车辆。
寻找区域2、3就是车辆粗定位的目标所在,其主要流程包含以下3部分:①使用Sobel算子,对图中的横向边缘进行提取,同时除去纵行边缘的噪声[7];②采用Hough直线检测对其进行处理,将破碎的边缘信息整合成可以代表车辆特征的直线纹理特征;③采用聚类算法对这些直线特征进行聚类操作,就可以获取车辆粗定位的区域。各阶段处理结果如图4所示。
2.3 车辆检测
为解决车辆特征聚类中可能出现的错误(图4(c)中1,2区域),可以采用HOG特征对前方车辆进行精确检测与定位。方向梯度直方图(Histogram of Oriented Gradient,HOG)是一种在计算机视觉和图像处理中用来进行物体检测的特征描述算子,它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Dalal N[8]使用HOG特征结合线性SVM分类器在行人检测问题上获得极大成功。本文选用64*64的块尺寸作为车辆HOG特征计算范围,以16*16的胞元作为计算梯度的基本单位,块滑动距离为8个像素,相邻胞元间有一半的像素重叠,如图5所示。将梯度方向划分成9个直方图通道,这样每个车辆样本拥有1 764维特征。
2.4 行车安全建模
在城区道路拥挤的交通情况下,有着车距近、车速低的特点。因此,在作最终决策时主要以时间为衡量标准。本系统中可以通过手机GPS获取速度信息,但难以对前方车辆进行精确的距离测量。因此,考虑一种离线量测的方法建立车辆像素尺寸与前车距离之间的关系来进行建模。相机位置如图6中所示,镜头主光轴与地面平行竖直向前,距地面高度与车内后视镜高度一致。待测车辆向前行驶,相机在拍照的同时记录对应的距离S1、S2…Sn。考虑到相机镜头存在的切向畸变,同时要对左二车道、左一车道、本车道分别进行同样的量测。最后以车辆像素坐标(x,y)为键,实际距离S为值建立字典D实现存储。
S=D[x,y]
通过构建行车安全模型,获取了决策所需速度与距离信息。当距离前车行驶时间大于2s时认为车辆行驶环境良好;当距离前车行驶时间介于1~2s时对驾驶员作出安全提示;当距离前车的行驶时间小于1s则给出安全警告。
3 程序设计与实现
3.1 Android Camera
Android SDK提供了完整的条用摄像头的应用框架,其中最为重要的是Camera类以及SurfaceView类,分别提供了操作摄像头和显示预览画面的API[9]。具体而言,摄像头的预览及数据抓取步骤如下:①surfaceCreated中创建相机对象Camera.open();②调用setPreviewDisplay(),将摄像头捕捉到的画面绑定到已经定义好的SurfaceView控件上用于显示;③surfaceChanged()中对相机进行初始化操作,设置相机预览分辨率,对焦方式、抓取视频的格式等;④onPreviewFrame()中摄像头会将捕获到的每一帧相机预览数据以byte[]数组形式返回。
通过上述步骤可以实现Android摄像头的开启、参数设置、视频帧捕捉等一系列操作。在onPreviewFrame中将byte[]图像数据由YUV格式转换为RGB图像格式并以整型数组的形式进行存储,作为下一步车辆检测模块的输入。
3.2 Java本地接口(Java Native Interface)
Java本地接口是一个编程框架,使得运行在Java虚拟机上的Java调用或者被调用特定于本机硬件与操作系统的用其它语言(C、C++或汇编语言等)编写的程序。如图7所示,性能关键代码由C/C++实现,系统架构代码由Java实现。采用此种开发方式的应用程序成为JNI程序,其优势在于[10]:①可利用C/C++来开发高性能的应用程序;②能重复利用平台相关特性;③可以复用大量已有的高质量C/C++代码。
3.3 Android端UI设计
Android程序的界面设计通过在XML文件中定义来实现。通过XML这种可扩展标记语言,定义Android程序界面上的所有控件,并指定控件的属性及组织方式。在本系统中采用设计两层SurfaceView控件叠加的布局方式,下层SurfaceView控件实时显示Camera的预览画面,上层SurfaceView控件对检测结果及当前系统运行状态进行显示,如图8所示。
3.4 代码编译与调用
在完成代码编写后,需要使用Android NDK编译本地代码[9]。系统开发过程中,需要在Windows环境下搭建Cygwin来模拟Unix系统环境,在Cygwin中将编写的本地代码编译成So库文件。可以将生产的So库与Java代码一并打包产生Android APK。代码编译与库文件调用流程如图9所示。
4 测试结果
为了对比算法的运行效率,基于PC平台采用不同的算法对同一视频图像进行测试。图像尺寸为840*480,环境为X64-Release,CPU主频为2.6GHz。
从表1可以看出,采用本文设计的处理算法,针对车辆可能存在的区域提取ROI可以有效避免滑动模板匹配在处理图像金字塔中的耗时操作[12],检测效率显著提升。使用小米3(2013年9月上市)作为测试机型,在处理速度上完全实现了数据实时抓取以及性能实时检测,每帧处理时间约为14.3ms,测试结果如图10所示。
5 结语
本文基于Android平台探讨了前方车辆检测实现方法,进行了行车安全建模、前车检测算法相关研究并完成了Android APP的测试与开发。在车辆检测的核心模块,针对Android手机计算能力有限的特点设计了车辆粗定位和精确检测相结合的算法。通过对车辆纹理特征进行分析,采用聚类方法对车辆可能出现的区域进行提取,改善了传统滑动模板法目标检测耗时久的缺陷,实现了基于手机平台对前方车辆的实时检测。最后将检测结果代入设计好的危险评价模型并作出最终决策。
参考文献:
[1]王荣本, 郭烈, 金立生,等.智能车辆安全辅助驾驶技术研究近况[J].公路交通科技,2007,24(7):107-111.
[2]VIOLA P, JONES M. Robust real-time object detection[J]. International Journal of Computer Vision,2001(4):51-52.
[3]PAPAGEORGIOU C P, OREN M, POGGIO T. A general framework for object detection[C].Sixth international conference on Computer vision,1998: 555-562.
[4]李云种,何克忠,贾培发.基于阴影特征和Adaboost的前向车辆检测系统[J].清华大学学报: 自然科学版, 2007,47(10):1713-1716.
[5]魏凯,盛建平,熊凯.基于阴影特征的前向车辆检测和测距方法研究[J].机械设计与制造,2013 (2):131-133.
[6]DENG Y,MANJUNATH B S,SHIN H.Color image segmentation[C].IEEE Computer Society Conference on Computer Vision and Pattern Recognition,1999.
[7]吴国伟, 谢金法, 郭志强.基于Sobel算子的车辆轮廓边缘检测算法[J].河南科技大学学报:自然科学版,2009,30(6):38-41.
[8]DALAL N,TRIGGS B.Histograms of oriented gradients for human detection[C].IEEE Computer Society Conference on Computer Vision and Pattern Recognition,2005:886-893.
[9]安卓开发官网[EB/OL].http://developer.android.com/.
[10]金泰延.Android框架揭秘[M].北京:人民邮电出版社,2011.
[11]VIOLA P,JONES M.Fast and robust classification using asymmetric adaboost and a detector cascade[J].Advances in Neural Information Processing System,2001(4):14.
[12]FELZENSZWALB,P F GIRSHICK,R B MCALLESTER,et al.Object detection with discriminatively trained part based models[J].IEEE Transactions on Pattern Analysis and Machine Intelligence,2010,32(9):1627-1645.
(责任编辑:孙 娟)
Abstract:Development a front-vehicle detection system based on Android smartphone.Use the phone camera to catch the image data of the road,and then use the Android native method to processing the image data and return the result back.The Android platforms compute capacity is not good while the detection algorithm efficiency is slow .In order to solve the above problem,we design a vehicle ROI location algorithm. First use the intrinsic texture on car to filter the detection area,then use the cluster algorithm to locate vehicles ROI.Then, precise positioning the outline of vehicle by HOG feature with SVM classifier,in this step the miss cluster area also been rejected.Finally realize a real time front-vehicle detection system on Android platform.
Key Words: Android Platform;Front-vehicle Detection;JNI Technics; Safety Assistance