利用计算机视觉库的Android平台系统道路识别

来源:本站
导读:目前正在解读《利用计算机视觉库的Android平台系统道路识别》的相关信息,《利用计算机视觉库的Android平台系统道路识别》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《利用计算机视觉库的Android平台系统道路识别》的详细说明。
简介:利用计算机视觉库OpenCV和Android NDK编译技术在Android平台上实现道路识别的处理过程。首先简要介绍了开源计算机视觉库OpenCV及其移植到Android平台上的方法,该方法使Android平台的应用更加广泛,能够更好地实现各种复杂图像的处理。

引言

道路识别系统,可以协助汽车司机安全驾驶,通过分析道路路况、车距以及识别车道线,减少车祸率。目前,Android系统主要借助底层的Skia图形图像处理库进行图像处理。但是Android系统在图像处理方面的功能不是很完善,处理的能力相对有限,只能针对图像进行简单的变换,无法对复杂背景以及噪声严重的图像进行处理和识别。所以提出一种在Android系统下利用计算机视觉库OpenCV进行图像处理的方法。实验证明,OpenCV库可以方便地应用到Android系统中。

1 OpenCV简介

本文借助OpenCV图像处理开发包,利用Android NDK技术实现了基于Android平台的道路识别系统。

OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 相对于MATLAB 等其他常用的图像处理软件来说,还有其显著的优势:

① OpenCV拥有包括300多个C函数的跨平台的中高层API。它不依赖于其他的外部库——尽管也可以使用某些外部库。

② OpenCV对非商业应用和商业应用都是免费的。

③ OpenCV为Intel Integrated Performance Primitives (IPP) 提供了透明接口。这意味着如果有为特定处理器优化的IPP库,OpenCV将在运行时自动加载这些库。

④ 可移植性好。OpenCV提供的视觉处理算法非常丰富,并且它部分以C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整地编译链接生成执行程序,所以很多人用它来做算法的移植。

2 OpenCV移植到Android

2.1 Android应用程序开发环境搭建

Android开发平台可以搭建在Windows操作系统下,也可以搭建在Linux操作系统下。本文是基于Linux操作系统下开发的,使用的是Ubuntu9.0操作系统。Android开发所需要的软件主要有集成开发环境Eclipse、JDK、Android SDK和ADT插件。

自从OpenCV 2.2发布以来,OpenCV就可支持Android平台,本文使用的版本是OpenCV 2.2.1。

2.2 OpenCV的移植

① Android的开发平台是使用Java语言进行开发的,而OpenCV由一系列 C 函数和少量 C++ 类构成,所以想要在Android系统应用程序中调用基于C/C++编写的OpenCV库,则需要使用NDK对OpenCV源码进行编译,生成共享库so文件。

② Android的应用程序开发框架提供给开发者的都是Java API,然而底层的本地库是基于 C/C++语言编写的,所以需要一个机制将它转换,之后提供给开发者 Java 接口。JNI(Java Native Interface)译为 Java 本地接口,它使 Java可以通过JNI调用C/C++的库。

③ 为了使用户能够方便地在Android设备上安装和使用本系统,则需要将本系统打包成apk格式的应用软件。通过Android应用程序编写Java端的代码,最后通过Android SDK生成Android应用程序.apk。

1

图1 结构框图

结构框图如图1所示。

3 系统的结构框架

本系统主要是通过在移动设备上应用安全驾驶的辅助程序来协助司机减少车祸的发生。构思图如图2所示,上边图像中的斜线为系统检测的范围,下边图像中的矩形框为车辆标识的对象,两侧直线为系统识别的车道线。该系统主要通过Android设备自带的Video摄像头功能采集视频图像,对摄像头进行初始化和参数设置,将采集到的一帧数据传给图像处理模块,以便进行车辆跟踪和道路线检测,之后将结果信息传给提示警告模块以便作出决策。

2

图2 构思图

所以根据系统功能的分析,把道路识别系统分为视频图像采集模块、图像处理模块和提示警告模块。模块划分如图3所示。

3.1 视频图像采集

Android系统的Linux内核和驱动程序运行于内核空间。Android设备的摄像头就是由 Linux提供的内核标准的视频驱动程序,即Video4Linux(Video for Linux),简称V4L。目前的版本为Video4Linux2(V4L2)。它驱动的Video设备可以支持捕获及视频输出方式。图像采集的流程图如图4所示。

3

图3 模块的划分图4 图像采集流程图

本文利用摄像头Intent捕获视频,部分代码如下:

//创建新的Intent

Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); //创建保存视频的文件

intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); //设置视频文件名

intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);//启动视频捕获Intent

startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);

startActivityForResult()方法执行完毕,用户摄像完毕(或取消操作)后,用户界面返回应用程序,这时必须监听onActivityResult()方法来接收intent的返回结果并执行后续操作。

3.2 图像处理模块

图像处理模块主要包括车辆跟踪和车道线检测。这两个功能是通过OpenCV自带的库函数进行实现的。

① 车辆跟踪主要运用的是基于Kalman滤波器的团块跟踪。首先,采用平均值法建立初始背景,对帧图像进行滤波和去噪声处理,并对背景进行减操作和OSTU自适应阈值算法检测运动目标。其次,背景更新以便适应新的环境变化。最后是团块跟踪,主要是通过卡尔曼滤波器建立运动模型,对运动目标的下一步的运动进行预测,并用查找轮廓的方法绘制矩形区域圈住目标图像,找到运动目标的重心,求出相对于自己车辆的距离。

② 车道线检测主要运用的是Hough变换。首先,通过Canny算法找到图像的轮廓,然后用Hough变换检测直线,最后用line()函数将直线画出。在图像中会检查出很多条直线,因此通过车道线的角度,把检测到的直线分成左右车道线两组,对每一组进行排序,绘制找到的最长的车道线。

相关的一些函数:

void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );//二值化

int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,int header_size=sizeof(CvContour), int mode=CV_RETR_LIST,

int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) );//查找轮廓

CvSeq* cvHonghLines2(CvArr* image,void* line_storage,int mehtod,double rho,double theta,int threshold,double param1=0,double param2=0);//Hough变换

车道线和车辆识别结果如图5所示。

4

图5 车道线和车辆识别结果

3.3 提示警告模块

所设计的道路识别系统主要通过发现一些异常驾驶行为来提醒司机安全驾驶,所以需要一些相应的提示和警告模块。有以下异常时,系统会发出警告和提醒:

① 当车身与其他车辆的距离在不正常的范围时;

② 当车速超过规定范围时;

③ 当车身和车道线之间的位置出现异常时。

检测到以上情况,用Android.media.SoundPool类实现声音警报程序。

结语

车辆识别系统,可以提醒驾驶员安全驾驶以及避免交通事故的发生。软件主要基于Android平台开发,利用了开源计算机视觉库OpenCV的图形图像工具和Android NDK编程相结合,实现了基于Android平台的道路识别系统。本系统还有许多不足之处,比如有时无法检测到两边的车道线,报警系统还不是很完善,在下一步的研究中,会尽量完善和改进。

提醒:《利用计算机视觉库的Android平台系统道路识别》最后刷新时间 2024-03-14 01:01:28,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《利用计算机视觉库的Android平台系统道路识别》该内容的真实性请自行鉴别。