精华内容
下载资源
问答
  • 基于视觉的曲线车道线检测完整代码,采用滑动窗口,详情见博客:http://blog.csdn.net/adamshan/article/details/78733302
  • python+opencv车道线检测(简易实现) 技术栈:python+opencv 实现思路: canny边缘检测获取图中的边缘信息; 霍夫变换寻找图中直线; 绘制梯形感兴趣区域获得车前范围; 得到并绘制车道线; 效果展示: 代码实现:...
  • 车道线检测国外现状

    2018-06-23 22:20:26
    车道线检测深度学习车道线检测深度学习深度学习车道线间测
  • 基于matlab的车道线检测程序,对比不同边缘检测算法,通过改进hough变换来检测视频中的车道线,每一步算法都具有详细的解释说明
  • 利用opencv开发的车道检测和车辆识别代码,包含源代码、目的代码、演示视频。
  • 道路视频车道线检测

    2019-04-18 09:45:42
    内含两个车道线检测例子:一个是python语言编写,一个是MATLAB语言编写 包含了MATLAB车道线识别的m程序,用于从视频流识别车道线,可调整相关参数。同时包含了四个车道线识别的视频,可用于车道线识别的测试。 基于...
  • 车道线检测代码 python

    2018-12-11 17:01:17
    本资源仅供学习交流。 期末 老师留的大作业,这个应该是标准代码了。
  • Python语言;代码包括有原始图像确定ROI...在RGB色彩空间中对黄白两种颜色进行过滤从而提取出车道线的像素;HLS阈值化处理;组合梯度和色彩过滤车道线像素;滑窗多项式拟合车道线;拟合曲线使用透视变换还原到原视角。
  • !!!CSDN的一个特性: 即使我设置成免费下载,被下载的次数多了之后也会变成付C币下载的了,这个很头疼. ...从车道线检测项目入门opencv, 对应https://www.bilibili.com/video/BV1qk4y1r7jw/的课程的课件代码
  • 车道线检测项目的原视频,没有车道线标注的原始视频,用来完成 https://www.bilibili.com/video/BV1qk4y1r7jw 的项目
  • 针对现有车道线检测与跟踪算法效率不高的难题,提出了一种基于视觉传感器与车道级高精度地图相融合的车道线检测与跟踪方法。该方法首先用改进的Hough变换提取边缘线段;然后基于滤波预测与更新车道线模型状态参数;...
  • 提出了一种新颖的适用于自主驾驶系统的车道线检测与跟踪算法。该算法采用了广义曲线的车道线参数模型,能同时适应弯道和直道的检测。该检测算法最突出的贡献在于,没有仅仅使用单一方法求解各个参数,而是根据各参数的...
  • 基于OpenCV车道线检测

    2018-04-16 11:17:25
    基于VC++6.0的车道线检测代码,对视频进行实时处理,并对车道线进行标注
  • 本程序基于OpenCv给出了一种车道线检测的算法,首先通过OSTU进行二值化处理,随后通过改进的霍夫变化进行车道线检测,具有比较好的效果。
  • 无人驾驶车道线检测算法,另外还包含了自动驾驶学习资料: 涵盖感知,规划和控制,ADAS,传感器; 1. apollo 相关的技术教程和文档; 2. adas(高级辅助驾驶)算法设计(例如 AEB,ACC,LKA 等) 3. 自动驾驶鼻祖 ...
  • 对摄像头拍摄的车道线视频进行提取,利用相应的图像处理知识进行视频的处理,提取相应的信息
  • 车道线检测

    2021-09-08 11:57:29
    基于边缘检测与Hough变换的车道线检测第一章:绪论1.1 研究意义及背景 高速公路的通行里程是一个国家发展水平的重要标志之一。高速公路具有车辆通行能力大、交通事故少、经济效益高的特点,它的不断发展引起了经济...

    基于边缘检测与Hough变换的车道线检测

    第一章:绪论

    1.1 研究意义及背景

    高速公路的通行里程是一个国家发展水平的重要标志之一。高速公路具有车辆通行能力大、交通事故少、经济效益高的特点,它的不断发展引起了经济社会的重大变革,不仅有力地改变了人们的时空观念和地域观念,更促进了公路沿线地区社会和经济的发展,便利了沿线地区人们的出行,人们的生活质量和办事效率也得到了极大提高。汽车是高速公路的重要载体,凭借其灵活的机动性为人类生活的改善和现代社会的发展做出了巨大的贡献。随着汽车的普及,交通安全问题越来越受到人们的普遍关注和极大重视。20世纪40年代时,人们开始研究人-车-道的相互影响问题,由于道路建设缓慢,世界各地的交通事故、环境污染、能源浪费、道路堵塞现象变得越来越严重,尤其是在我国,交通问题日益突出,目前,我国已成世界上交通事故死亡人数最高的国家之一。据报道,我国2014年交通事故死亡人数为34292,34人,比起2013年31604,3人、2012年30222,5人、2011年29618人,死亡人数呈逐年小幅度的上升趋势。因此,从上世纪70年代开始,全世界各国的工程师开始利用迅猛发展的电子,信息,计算机等高新科技技术来缓解目前拥堵的交通状况,并陆续在世界各地建立新型交通系统,并由此产生了智能交通(ITS)的概念。

    智能交通系统(Intelligent Traffic Systems, ITS)的前身是智能车辆道路系统(Intelligent Vehicle Highway System, IVHS)。智能交通系统将先进的信息技术、数据通信技术、传感器技术、电子控制技术以及计算机技术等有效地综合运用于整个交通运输管理体系,从而建立起一种大范围内、全方位发挥作用的,实时、准确、高效的综合运输和管理系统。该系统的一个主要子系统:车道偏离警告系统。

    因此,研发一种保障行车安全的综合系统十分必要。当驾驶员疲劳以及精神分散或者车辆出现车道偏离以及车辆安全车距过小存在追尾可能时能给予主动报警,必能极大地降低交通事故发生的可能性,对于减少公路交通事故及人员伤亡有着特别重要的意义。而该系统一个至关重要的工作就是快速地,准确地利用车载传感器获取前方道路的车道线或道路边缘。


    1.2 国内外技术发展状况

    1.2.1国外车道偏离报警系统

    车道线是道路交通中最重要的交通标志,可以对车辆的行驶起到约束保障的作用。无论是在车辆安全驾驶系统中还是在基于机器视觉的智能车辆导航中,车道线的检测与识别都是一个基本的、必须的功能模块,通过它不仅可以降低交通事故的发生,而且可以为以后智能交通深入研究提供帮助。因此早在人们对智能车以及智能交通研究开始阶段,就十分重视对车道线检测与识别的研究。许多国家都投入大量资金以及人才对其进行深入研究并取得了丰硕的研究成果,在这些国家中尤以德国、美国、意大利、日本对这一技术研究的比较深入。

    1.AURORA系统

    该系统由美国卡内基梅隆大学机器人学院于1997年开发成功。该系统由带广角镜头的彩色摄像机、数字转换器和一个便携SunSparc工作站等组成。该系统通过安装在车辆一侧的视野大约为1.5m-1.6m区域的俯视彩色摄像机检测车辆旁边的车道标识,通过数字转换器采集摄像机的视频输出并在一个便携Sunspace工作站上进行处理,处理速度为60Hz。

    2.AutoVue系统

    该系统由前DaimlerChrysler公司和美国的Iteris公司联合开发。该系统主要由一个安装在汽车内风窗玻璃后部的摄像机、两个立体音箱、一个小显示设备和控制单元等组成。该系统工作原理是通过实时监测本车在当前车道中的位置,计算本车到车道标识线距离,然后与设定的报警距离相比较,判断是否进行预警。当检测到将要发生车道偏离时,它将发出一种类似于车辆在隆声带上行驶时发出的隆隆作响的声音来提醒驾驶员修正车辆位置。目前,AutoVue系统已经在欧洲的多种货车上作为一个选件进行了装备。

    3.Mobileye_AWS系统

    该系统由总部设在荷兰的Mobileye公司研制。该系统利用安装在前风窗玻璃上的单个摄像机监测车道标识线,测量和监控本车与道路边界的距离。该系统的车道偏离警告模块通过检测道路边界,计算车辆相对于车道的位置和车辆的侧向运动,预测车辆将横越车道标识的时间,当该时间低于设定值时,系统触发视觉警告和声音警告,以使驾驶员对不同的危险状态做出适当的反应而减少意外事故的发生。该系统在有意识的车道偏离、制动和没有道路标识等情况下能对警告的产生进行了抑制。

    4.DSS系统(Driver Support System)

    该系统由日本三菱汽车公司于1998年提出,并于1999年秋季应用于模型车上。该系统由一个安装在汽车后视镜内的小型CCD摄像机、一些检测车辆状态和驾驶员操作行为的传感器以及视觉和听觉警告装置组成。该系统利用由CCD摄像机获得的车辆前方的车道标识线、其他传感器获得的车辆状态数据和驾驶员的操作行为等信息,判断车辆是否已经开始偏离其车道。如有必要,系统将利用视觉警告信息、听觉警告信息以及振动转向盘来提醒驾驶员小心驾驶车辆。

    1.2.2 国内车道偏离预警系统

    1.JLUVA-1系统

    该系统由吉林大学智能车辆课题组开发。该系统是基于单目视觉的前视系统,主要由车载电源、嵌入式微机、显示设备、黑白CCD摄像机、数据线、音箱以及图像采集卡等组成。

    系统利用安装在汽车后视镜位置处的CCD摄像机采集汽车前方的道路图像,通过图像处理获得汽车在当前车道中位置参数,当一旦检测到汽车距离自身车道白线过近有可能偏入邻近车道而且司机并没有打转向灯时,该系统就会发出警告信息提醒司机注意纠正这种无意识的车道偏离,从而尽可能地减少车道偏离事故的发生。

    2.基于DSP技术的嵌入式车道偏离报警系统

    该系统由东南大学开发,是基于单目视觉的前视系统,由模/数转化及解码电路模块、缓冲电路模块、媒体处理器DSP电路模块、编码及数/模转换电路模块等模块组成。该系统通过车载摄像头采集被跟踪车道线的模拟视频信号,经解码生成数字信号码流缓冲后送到高速媒体处理器DSP的视频接口,然后再由视频处理模块对数字视频信号进行车道特征值的提取,最后将处理后的视频信号送编码及数/模转换电路输出显示。

    1.3 本文主要研究内容

    本文研究的主要内容是车道线检测识别与软件设计。车辆的自动或辅助驾驶、驾驶员预警系统是智能交通系统(Intelligent Transportation System)的重要研究内容,而道路边界的识别和跟踪是实现这一技术的首要问题。本文在借鉴国内外研究成果的基础上,致力于提高我国快速车道线识别技术。本文分为以下几个模块:图像的采集、图像预处理(图像灰度化、边缘检测等)、基于Hough变换的直线检测算法、提取车道线。

    本文共分五章:

    第一章主要介绍了课题研究的背景、意义和研究的国内外现状,结尾介绍了本文主要研究内容和章节安排。

    第二章主要介绍了道路图像预处理当中的一些技术,首先是图像灰度化,然后介绍几种图像增强的方法,如邻域平均法、中值滤波法等,并对各算法进行对比分析;接着对几种常用的边缘检测算子如canny算子,prewitt算子,log算子的进行对比,并结合实践提出了一种新算法。

    第三章介绍了进行车道线检测的主要算法,在这一章的开始简要介绍了本文需要使用的一些基本概念,然后详细介绍本文所使用的算法,给出了具体实现。

    第四章对文章进行了简要的总结,指出本文的主要贡献和不足之处,对今后的车道线检测研究作了展望。


    第二章 道路图像预处理

    要实现车道线检测与识别,首先必须要提取图像的特征点。但是在现实道路环境中存在很多的干扰因素,如:阳光,阴影,车道线不清楚,车辆和障碍物等,这些都给提取车道线带来了很多的干扰。所以,本文使用了一些图像预处理的方法对拍摄的道路图像进行处理。

    2.1 道路图像灰度化

    车道线检测系统中,如何提高实时性是一个非常关键的技术要点。从车辆摄像头采集的图像一般为彩色图像,但是图像的边缘检测、平滑处理等问题,基本是在灰度图像上完成,而且彩色图像所含信息量较大,对其的处理也就需要很大的计算量和较长的时间,并且对硬件要求比较高,从而在各方面影响了系统的实时性。因此在车道线检测系统中一般需要对摄像头采集的彩色图像进行灰度化处理,使之成为灰度图,以达到提高实时性的目的[6]。

    图像的灰度化是指把彩色图像变换成灰度图像的过程。红色(Red)、绿色(Green)、蓝色(Blue)三种色彩按不同比例构成了彩色图像中的各个像素点。各自分量的亮度由灰度值表示,由于亮度信息由暗到明是连续变化的,所以要描述图像的灰度图,就需要把亮度值进行量化。通常划分成 0 ~255 ,共256个级别,0 表示全黑,255 表示全白。1~254 则表示介于全黑和全白之间的不同亮度。一般有以下四种灰度化的方法:

    分量法:将彩色图像中的三个分量R,G,B的值作为灰度图像的灰度值,根据不同的情况选择其中一种灰度图像。


    v2-566eaae94f9b8cd8d0f1b9d242f444ad_b.jpg


    加权平均法:根据R,G,B三个分量的重要性,将三个分量赋以不同的权值再进行平均。鉴于人眼对绿色敏感度最高而对蓝色敏感度最低这一视觉特性,按照下式进行加权得到的灰度图像较为合理,所以本文选择加权平均法将彩色图像灰度化。


    v2-061fe5a568216dbddbac8cd590543d22_b.jpg



    v2-5ad41fdf2cd00e111eaf6dff4c757b4b_b.jpg



    v2-29fb4e7f5b8eeba911d20abd3bbb6c99_b.jpg


    2.2 道路图像滤波

    图像滤波处理用来消除图像中的噪声,滤波既可以在空域中进行也可以在变换域中实施,基本方法就是选取像素灰度的平均值或者中值。尽可能的保留图像所需的特征条件而抑制图像中的噪声,减少后续处理的干扰并保证图像处理的可靠性。

    二值化前后均可进行滤波处理。二值化前的滤波处理是基于灰度图像进行,滤波后势必导致灰度图像有部分信息丢失但同时也抑制了噪声的干扰。而在二值化以后,图像仍然会出现一些散点,这是为了有利于后续的处理仍需进行一次滤波处理。本文采取的是对灰度图像直接滤波。

    目前,图像滤波的方法有很多,例如:中值滤波法、高通滤波、低通滤波、高斯滤波、均值滤波等。在此本文不一一介绍,只对几种常用典型的滤波方法作简要的介绍。

    平均邻域法:假设相邻的像素点之间具有相关性,这个像素点的值可以用相邻像素点值的平均值来代替,以实现图像滤波。数学表达式如下:


    v2-c680290f7214f1c88ebf1c55191bd99f_b.jpg


    中值滤波法:中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,其基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。同时,中值滤波法是一种非线性平滑技术,对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。此外,中值滤波的算法比较简单,也易于用硬件实现。所以,中值滤波方法一经提出后,便得到重要的应用。滤波效果图1-1 数学表达式如下:


    v2-73b564484531e8f82fdd980b8126e4b3_b.jpg


    高斯滤波:高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。在图像处理中,高斯滤波一般有两种实现方式,一是用离散化窗口滑窗卷积,另一种通过傅里叶变换。最常见的就是第一种滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常大(即使用可分离滤波器的实现)的情况下,可能会考虑基于傅里叶变化的实现方法。

    车道线边缘提取中有一个边缘检测的过程,这要求在图像增强过程中要选择一种在去除噪声的同时能够较好的保持图像的边缘和细节的图像滤波方法,基于此要求,本课题进行大量的实验对比,分析各种方法的优缺点,最终选择了中值滤波作为本课题图像增强方法,因为在实验过程中,发现中值滤波能在滤除图像噪声的同时可以较好的保存车道的边缘特征。


    v2-d1a4488e4cf6948fa657469087bffe22_b.jpg


    中值滤波后的车道线图

    2.3 图像边缘检测

    在图像处理及应用中,图像边缘作为图像的一个最基本特征起着举足轻重的作用,它蕴含了图像丰富的内在信息,广泛应用于图像分割、图像分类、图像配准和模式识别中。所谓边缘是指图像特征不连续的分割点组成的线,这里说的图像特征的不连续包含有图像灰度级的突变、纹理结构的突变、颜色的突变等。边缘其实是图像一个区域的开始,另一个区域的结束,利用该特性可以对图像进行分割处理。

    目前,常用的边缘检测的方法有Robert算子,Prewitt算子,Sobel算子,Canny算子等,但是本文结合实验结果和实际应用采用自定义差分算子。以下将对各种算子进行简要介绍。

    2.3.1 Robert算子

    Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内 产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。该算子的计算公式如下:


    v2-2a86dc8157806621de0a9525750be7e9_b.jpg



    v2-935b19dd773b26a14bdf3277d6e99357_b.jpg


    robert边缘检测

    2.3.2 Prewitt算子

    Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。经典Prewitt算子认为:凡灰度新值大于或等于阈值的像素点都是边缘点。即选择适当的阈值T,若


    v2-e0b57a77056903859d9ad32b67b0bed0_b.jpg



    v2-1166521da85dad6dc777425578c65d8b_b.jpg


    Prewitt边缘检测图


    2.3.5自定义差分算子

    本文考虑到车道线的在图像中的方向特征,即左右车道线倾斜角度一般分别是 45°和 135°方向,所以自定义了两个差分算子。对平滑处理后的图像用这两个差分算子对道路图像做微分计算,就得到了道路图像的边缘。本文提出的自定义差分算子在提高了车道线的边缘像素点与周围区域像素点的对比度的同时,又保证了车道线结构完整。左右卷积核分别如下图所示:


    v2-2de0255818072866df76f3ce3390e6a9_b.jpg



    v2-0d20398200ebda20c6175d1cddf3abf8_b.jpg


    自定义差分算子边缘检测图


    第三章 车道线检测的算法设计

    在车道偏离预警系统中,其核心是如何快速有效地对车道线进行检测和识别,它主要包括车道线提取和车道类型判断两个部分。车道检测与识别是车道偏离预警系统研究的核心问题之一,其研究水平也是智能驾驶系统发展的重要标志。道路类型的判断对于车道偏离预警和智能驾驶同样起着至关重要的作用。车道线检测主要包括车道定位,车道线相对于周围环境特征提取以及对感兴趣车道的提取等。道路类型主要是判断道路直道、弯道的问题,本章针对车道线检测进行了探讨。

    本章没有从三维视觉的角度来实现车道线检测和道路环境分析,因为从算法的可行性来看,算法复杂,相应特征点查找困难,另外就是存在遮挡的问题。目前,基于视觉研究的大多数学者都尽量简化了这些复杂因素的影响,而去专心于系统核心问题—基于图像视觉的车道检测和识别。但从研究问题的实际看来,任何一个影响最终结果的因素都应该加以考虑,因为这些因素都可能带来最终结果的巨大偏差,尤其是在环境因素复杂多变的高速路上。这就导致了从三维视觉角度来研究车道偏离,只适合外界环境简单、变化小的情景。这对于外界环境多变的高速公路显然是不合适的,因此,本文采用基于单目视觉的方法对车道图像进行分析研究。在模型和算法设计时,尽量简化道路模型,采用结构化道路模型设计和车道动态预测算法,这种模型简化和设计可以实现对车道图像信息的快速提取,算法复杂度大大降低,有利于提高系统的整体性能。

    3.1 道路图像检测的常用方法

    目前常用的道路图像检测和识别算法有以下几种:

    (1)模拟神经网络方法:

    神经网络在图像识别中的应用按处理数据类型大致可以分为两类:—类是基于像素数据的神经网络算法;另一类是基于特征数据的神经网络算法即特征空间的聚类识别算法。基于图像像素数据的神经网络识别技术,是用高维的原始图像数据作为神经网络的训练样本。目前很多神经网络算法是基于像素进行图像识别的。在车辆辅助驾驶系统中,经常采用人工神经网络的方法,它主要通过神经网络来模拟现实中的车辆驾驶,但是这种方法在对车道进行检测和判断时预先不能确定车道线的具体位置,所以该方法不适合结构化道路的检测和判断,尤其是用于高速公路判断时,实时性较差,它主要应用在非结构化道路的判断。

    (2)基于彩色图像分割的方法:

    彩色图像分割是数字图像处理领域一类非常重要的图像分析技术,在对图像的研究和应用中,根据不同领域的不同需要,在某一领域往往仅对原始图像中的某些部分感兴趣。这些目标区域一般来说都具备其自身特定的一些诸如颜色、纹理等性质,彩色图像分割主要根据图像在各个区域的不同特性,而对其进行边界或区域上的分割,并从中提取出所关心的目标。图像分割注重对图像中的目标进行检测和测量,通过对图像的分割、目标特征的提取,可将经初步图像处理的图像特征向量提取出来,在车道检测中,该方法在基于 RGB 彩色空间原理基础上,依据车道图像在 R,G,B 三个基本分量与车道周围环境分量的不同,对车道图像进行道路路面和非路面的划分,该方法非常适合没有车道标识线的道路。

    (3)基于灰度图像的车道识别方法:

    目前在车道线检测和识别领域最常用的方法就是基于灰度图像的车道检测和识别的方法,灰度图像不仅图像信息量大大减少,而且我们可以充分利用车道线路面与非路面的灰度差值对图像噪声进行去除,同时利用白色车道线灰度值的特征可以对车道标识线进行检测和识别,这种方法常用于高速公路车道线的识别。当然这种方法也有一些亟待解决的问题,就是当车道线被树阴、道路两旁的建筑物、桥梁、隧道或其他车辆遮挡时,这些情况都会对道路图像的灰度值产生影响,进而可能对检测和识别结果产生影响,这些问题都是今后考虑的重要方面。

    在认真分析近几年来有关车道检测和识别技术的基础上,得出当前人们在这个问题上研究的主要方向为:一个侧重于根据车道线信息与路面信息的不同,对车道线进行检测和识别,另一个侧重于研究车道线边缘信息与车道附近点信息的不同来检测和识别。根据分析,可以得知当前基于灰度图像的车道线检测与识别算法主要采用 Hough 变换的方法。Hough 变换提取直线算法是一种利用图像全局特性把边缘像素连接起来组成区域封闭边界的一种方法。它的主要优点是受噪声和曲线间断的影响较小。所以本文采用基于 Hough 变换的方法来进行车道线的检测。

    3.2 基于Hough变换的车道线检测

    3.2.1 Hough变换原理

    在车道线直线提取算法中,Hough 变换是最常用的方法之一,且快速车道基本上是直线,弯道较少,适合采用Hough变换检测车道线。其优点在于抗噪性能好,算法稳定。Hough 变换[13]于 1962 年由 Paul Hough 提出,并在美国作为专利被发表。它所实现的是一种从图像空间到参数空间的映射关系如图 4.1(c)所示。由于具有一些明显优点和可贵性质,它引起了许多国内外学者和工程技术人员的普遍关注。例如,由于其根据局部度量来计算全面描述参数,因而对于区域边界被噪声干扰或被其他目标遮盖而引起边界发生某些间断的情况,它具有很好的容错性和鲁棒性。Hough 变换的实质是将图像空间内具有一定关系的像元进行聚类,寻找能把这些像元用某一解析形式联系起来的参数空间累积对应点。在参数空间不超过二维的情况下,这种变换有着理想的效果。Hough 直线变换其原理是利用点线的对偶性来实现的,如下图所示:


    v2-abab566af9c4b89e9e3ff9498b6decdc_b.jpg


    3.2.2 Hough变换提取车道线

    由于车载摄像机拍摄的道路图像中含有大量的景物细节,比如行人、阴影、绿化带、树木、车辆、其它遮挡物等。本文车道图像在经预处理后得到的图像如图 2-1所示,由图中可以看到,所有这些车道图像的区域边界围成了形状各异的、或稠或密、大小不一的区域集合,而且这些区域大小不同、像素值多少不同,小到几个像素点,大则可能连成一片独立的区域。但是图像中的车道边界则由一些连续或断续的近似直线的边界区域组成的集合。基于这种区域特征,可以假想建立一种基于边界形状特征的道路模型,其能够将车道区域与其它区域区别开来。因此,本文从车道边界的形状特征入手来建立模型,国内外很多研究人员都基于这种思想而建立模型,其中有使用多项式曲线作为道路的形状模型、回旋曲线作为道路的形状模型以及直线作为道路的形状模型等。其中的直线模型是最简单的模型假设。为了减小算法的复杂度,提高系统的运行速度,本文采用直线道路模型。由于高速公路的弯道曲率一般比较小,在车辆高速行驶时,系统只需采集车辆前方不太远处的道路图像,因而采用直线道路模型,就可以满足要求。合理采用道路模型假设可以有效提高道路识别算法的快速性和鲁棒性。本文对道路特征做了如下假设:

    (1)路面是水平的,或者其高度变化服从一定的数学模型。(2)道路是结构化道路,即具有良好视觉效果的白线导航,周围无障碍物,道路宽度基本一致、有明显的车道标示线或边界、路面平坦的道路环境,可以依据边缘、颜色等信息来检测。

    对信息融合后的图像进行 Hough 变换,为了避免背景上的建筑等其他物体也可能存在直线而造成误判断的情况。本文设置一个阈值 L,当检测出一条直线时,将其长度与阈值 L 作比较,当直线长度大于 L 时,则认为是一条车道线,并保存直线的斜率、截距、起点和终点四个元素,并作标记;小于阈值 L 时,则舍弃。这样就很好的排除短小噪声直线的干扰。


    v2-1fb77a5f1ceeab5a77184773b2a0bdf8_b.jpg


    在这里,我们把边缘检测出来的图像进行Hough变换得到车道线在极坐标系下的参数,然后再把这些参数绘制成下图4-3:


    v2-9d303dcdc5858854362d427a7bcf5028_b.jpg


    从图中我们可以统计出这些曲线的重叠情况,然后根据统计值进行判断直线所在位置,并在原图中对直线进行标识。如下图4-4:


    v2-94c2245d0d3845fbde8f41246007e920_b.jpg


    图4-4通过Hough变换标识车道线



    参考文献:

    [1] 王荣本,李斌.世界智能车辆行驶安全保障技术的研究进展[J].公路交通科

    技,2002,19(2):80-85.

    [2] 余人洪.基丁机器视觉的车道偏离预警系统研究[D].吉林:吉林大孕交通学

    院,2006.

    [3]Morten Welde,James Odeek. Evaluating the Economic Impacts of

    Intelligent TransportSystems. Proceedings of the 14th World congress on Intelligent Transport System,2007:2028.

    [4]Guoqiang Zhang, Jian Lu,Qiaojun Xiang. Implementation of Intelligent

    TransportationSystems based paratransit services in China. Proceedings of the 14th World congress onIntelligent Transport System, 2007: 3032.

    [5]Xiaoxiong Weng,GuangzhaiLuo. Intelligent Traffic Information Systems

    based on featureof traffic flow. Proceedings of the 14th World congress on Intelligent Transport System,2007:3116.

    [6]李大新.基于机器视觉的车道线检测识别与车道偏离预警算法研究[D].山东

    大学,2012.

    [7]李大新.基于机器视觉的车道线检测识别与车道偏离预警算法研究[D].山东

    大学,2012.

    [8] 王植,贺赛先.一种基于Canny 理论的自适应边缘检测方法[J].中国图象图

    形学报,2004,9(8):957~962.

    [9] 王娜,李霞.一种新的改进Canny边缘检测算法[J].深圳大学学报(理工

    版),2005, 22(2):149-152.

    [10] Milan Sonka, Vaclav Hlavac, Roger Boyle著.艾海舟,武勃等译.图像

    处理、分析与机器视觉(第2版)[M].北京:人民邮电出版社,2003.235-389.

    [11] 万力,易昂,傅明.一种基于Canny 算法的边缘提取改善方法[J].计算技术

    与自动化,2003,22(1):24~26.

    [12] 杨正帅.基于视觉的道路识别技术在移动机器人导航中的应用研究[D].硕

    士学位论文.南京理工大学,2007.

    [13] P.V.C Hough. Method and Means for Recognizing Complex

    Patterns[J].U.S.Patent,1962:77~79.

    [14] 王怀理,王德生,田立生.Hough变换OCR图像倾斜矫正方法.中国图像图形

    学报[J],2001,2(5):57~61.

    [15] 胡斌,何克忠.基于分段直线模型和ATN的车道识别方法[J].清华大学学

    报(自然科学版),2006,46(10):15-18.

    [16] Li Xin, Yao Xiao-Cao,Yi L,Murphy. A real-time vehicle detection and

    tracking systern in outdoor traffic scenes[J]. Proceedings of the 17th International Conference on Pattern Rceognition, 2004:23~26.

    展开全文
  • 一种基于平行透视模型的车道线检测方法,杨秀平,陈永泰,本文提出一种基于平行透视原理的车道线模型,使用亮区域宽度宽约束法查找符合车道线模型的车道线边缘,并对查找到的车道候选边缘
  • opencv车道线检测

    2020-11-23 10:35:01
    基于Visual Studio 2015,并进行Qt配置Opencv,实现对视频中基于道路特征的 车道线检测方法。
  • 第三类 图像特征分析和检测课程项目的设计和实现.基于霍夫变换的图像直线段检测——以车道线检测为例
  • 基于opencv的车道线检测
  • MATLAB车道线检测GUI.zip

    2021-10-29 11:57:17
    MATLAB车道线检测,霍夫曼定理,带GUI界面。可以进行车道偏离预警。
  • 车道线检测 ····在参加udacity的课程后,对于车道线有了一些直观的认识,后来在实验室学习和外出实习过程中,也接触过不少车道线方面的检测工作,这边将对这些日子里的工作做一个总结。 ····这也是我写的第...

    车道线检测

    ····在参加udacity的课程后,对于车道线有了一些直观的认识,后来在实验室学习和外出实习过程中,也接触过不少车道线方面的检测工作,这边将对这些日子里的工作做一个总结。
    ····这也是我写的第一篇博客(以前都习惯整理在自己电脑里面,但想想还是没有blog绘声绘色)。
    ····车道线检测,从易到难:单直线车道检测–>单弯道车道检测–>多直线车道检测–>多弯道车道检测(事实上能检测弯道就能够检测直道,相当于曲率半径极大的弯道)
    ····我更希望用例子去说明,多按图说话。本篇分三个内容:

    ···· 1.讲解Udacity的CarND-LaneLines-P1-master项目
    ···· 2.讲解Udacity的CarND-Advanced-Lane-Lines-master项目
    ···· 3.讲解我在这基础上改进的multi-lane-lines-detection项目

    CarND-LaneLines-P1-master

    ····只能针对直线车道检测,结果稳定,实时性高,但波动大,鲁棒性差,有待改进。
    车道线
    ····如图所示,为项目结果图,从单车道检测而言,效果不错而且实时性高,那么具体是怎么做的呢!
    ····主要思路:对输入图像通过灰度化、高斯滤波、canny边缘检测;再框选出感兴趣区域,对感兴趣区域内的二值化点集进行hough变换,得到目标直线集;对直线集进行分类、合并得到稳定输出结果。

    思路讲解

    ····我们通过一帧图片来说明处理过程。
    在这里插入图片描述
    ····如图[image]所示为图像原图,此时为(540x860x3)的数组矩阵,即3层R,G,B通道色彩数据,canny算子变换只关注色值,即(540x860)矩阵中的数值,同一张图片,三通道色值差异不大,通过灰度化,压缩3通道为单通道,减少数据量,使用函数cv2.cvtColor(image, cv2.COLOR_RGB2GRAY),通常效果较好的是加权平均灰度化,其他具体处理方式见1,里面通过图例,简单直观说明其原理和方法。;
    ····对比[gray]、[blur_gray],明显觉得[blur]更模糊一些,这是由于[blur]进行了高斯滤波,设计一个计算核,大小为3x3或者5x5,类似加权平均的方法,权值满足正态分布,遍历图片,去掉可能存在的椒盐噪声,为hough变换做好准备,这里使用cv2.GaussianBlur(gray, (kernel_size, kernel_size), 0),实现高斯滤波,kernel_size就是核的大小,一般为基数,有疑惑的童鞋请见转载2,里面通过图例,直观说明常用图像处理滤波器;
    在这里插入图片描述
    ····此时,我们转移注意力到图[edges],[edges]通过边缘检测得到,边缘检测算子常见的有Canny,Roberts,Prewitt,简而言之,通过算子基于差分原理得到一个数值,代表区别度大小,再基于两个阈值对图像进行滤波,去除过多噪点,得到high_threimg和low_threimg,由于high_threshold阈值更大,必然去掉了部分有效特征,再与low_threimg图像进行比对、拼接,得到稳定的图像输出结果,这里使用cv2.Canny(blur_gray, low_threshold, high_threshold),通过high_threshold和low_threshold对区别度进行限制,实现理想的二值化图[edges],这里的threshold皆为经验调参值,关于Canny的详细见转载3
    关于其他算子综述见4.
    在这里插入图片描述
    ····我们可以看到对于一张图片的二值化处理,除了我们需要的车道信息,还会有周围环境特征,如天空、山、周边荒草环境等,为了提高算法鲁棒性,通过框选感兴趣区域,是一个不错的选择,[masked_edges]即为结果。这里我们只针对单车道线检测,划出图像中关于自身车位的前方及左右半条车道范围延伸至灭点,如上图所示,如针对多车道线测,那在框选时需要更加慎重,除了地平线以上剔除外,地平线以下根据拍摄质量好坏(像素较低时不足以得到一个稳定结果)和有效车道数设定(不要求全检测,只检测左右三车道,更合适用于实车运行),所用函数见下文代码解析;
    ····之后就是基于hough变换提取出若干线段,把二值化后的像素坐标点集(XY)转化到栅格化的极坐标(rθ),基于投票选举法,统计得到若干条概率最高的直线,针对这些直线进行合并和剔除,得到最终车道线,如图[line_image],完工!所用函数见下文代码解析,关于hough变换的具体细节见转载5,里面通过图例,直观说明常用图像处理滤波器(转载自其他作者,如有侵权请私戳)

    代码讲解

    ····上面讲解了思路,这里说明一下代码吧。主要是基于每个函数进行讲解,最后再说明优化方向。
    详见:https://github.com/wisdom-bob/CarND-LaneLines-P1-master

    # importing some useful packages
    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg
    import numpy as np
    import math
    import cv2
    
    # define some functions
    def grayscale(img):
        return cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    #     return cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # use BGR2GRAY if you read an image with cv2.imread()
        
    def canny(img, low_threshold, high_threshold):
    	#  Image Binarization with canny operator
        return cv2.Canny(img, low_threshold, high_threshold)
    
    def gaussian_blur(img, kernel_size):
    	#	gaussian filter by (kernel_size,kernel_size) operator
        return cv2.GaussianBlur(img, (kernel_size, kernel_size), 0)
    
    def region_of_interest(img, vertices):
        #defining a blank mask to start with
        mask = np.zeros_like(img)   
        
        #defining a 3 channel or 1 channel color to fill the mask, depending on the input image
        if len(img.shape) > 2:
            channel_count = img.shape[2]  # i.e. 3 or 4 depending on your image
            ignore_mask_color = (255,) * channel_count
        else:
            ignore_mask_color = 255
            
        #filling pixels inside the polygon defined by "vertices" with the fill color    
        cv2.fillPoly(mask, vertices, ignore_mask_color)
        
        #returning the image only where mask pixels are nonzero
        masked_image = cv2.bitwise_and(img, mask)
        return masked_image
    
    def draw_lines(img, lines, color=[255, 0, 0], thickness=8):
        for line in lines:
            for x1,y1,x2,y2 in line:
                cv2.line(img, (x1, y1), (x2, y2), color, thickness)
    
    def Ltopend(arr,imshape):
    	#	return the top point(x0,y0) and end point(x1,y1) of the line
        Arr = np.concatenate(arr, axis=0)
        k = sum(Arr[:,1]-Arr[:,3])/sum(Arr[:,0]-Arr[:,2])
        b = Arr[0][1]-k*Arr[0][0]
        
        x0 = int((imshape[0]-b)//k)
        y0 = imshape[0]
        for i in Arr:
            if i[3] == min(min(Arr[:,1]),min(Arr[:,3])):
                x1,y1 = i[3],i[2]
            elif i[1] == min(min(Arr[:,1]),min(Arr[:,3])):
                x1,y1 = i[1],i[0]
        return ((x0,y0),(y1,x1))
    
    def draw_lines2(img, lines, color=[255, 0, 0], thickness=14):
    	# updated draw_lines function
        le,ri= [],[]
        for line in lines:
            for x1,y1,x2,y2 in line:
                if (y2-y1)/(x2-x1)<0:
                    le.append(line)
                else:
                    ri.append(line)
        le = np.array(le)
        ri = np.array(ri)
        points = Ltopend(le,img.shape)
        cv2.line(img, points[0], points[1], color, thickness)
        points = Ltopend(ri,img.shape)
        cv2.line(img, points[0], points[1], color, thickness)    
                
    def hough_lines(img, rho, theta, threshold, min_line_len, max_line_gap,flag=0):
    	#	according to the HoughLinesP to get the lines, then draw them
        lines = cv2.HoughLinesP(img, rho, theta, threshold, np.array([]), minLineLength=min_line_len, maxLineGap=max_line_gap)
        line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8)
        if flag:
            draw_lines2(line_img, lines, img.shape)
        else:
            draw_lines(line_img, lines)
        return line_img
    
    def weighted_img(img, initial_img, α=0.8, β=1., γ=0.):
    	#	image blending
        return cv2.addWeighted(initial_img, α, img, β, γ)
    

    ····通过以上函数,我们设置了若干个函数接口用于接入灰度化、高斯滤波、canny二值化、hough变换等,那么基于以上函数,我们可以自己先尝试得到图像处理结果(上图的结果)。

    def showimg(subplace, title, _img):
    	#	design a subplot_imshow funciton
        plt.subplot(*subplace)
        plt.title(title)
        if len(_img.shape) == 3:
            plt.imshow(_img)
        else:
            plt.imshow(_img, cmap='gray')
    
    #	from loca upload some images
    names = []
    for file in os.listdir("test_images/"):
        names.append(str(file[:file.rfind('.')]))
        
    #	image->grayscale->gaussian_blur->canny->edges
    name = names[1]
    image = files[name]
    gray = grayscale(image)
    blur_gray = gaussian_blur(gray,7)
    edges = canny(blur_gray, 50, 150)
    
    #	Next we'll create a masked edges image using cv2.fillPoly() to get the region of interest
    mask = np.zeros_like(edges)   
    ignore_mask_color = 255   
    imshape = image.shape
    
    vertices = np.array([[(0,imshape[0]),(410, 330), (550, 330), (imshape[1],imshape[0])]], dtype=np.int32)
    masked_edges = region_of_interest(edges,vertices)
    
    #	Define the Hough transform parameters
    rho = 1                             # distance resolution in pixels of the Hough grid
    theta = np.pi/180                   # angular resolution in radians of the Hough grid
    threshold = 15                      # minimum number of votes (intersections in Hough grid cell)
    min_line_length = 25                 # minimum number of pixels making up a line
    max_line_gap = 25                   # maximum gap in pixels between connectable line segments
    line_image = np.copy(image)*0       # creating a blank to draw lines on
    
    #	Run Hough on edge detected image
    line_image = hough_lines(masked_edges, rho, theta, threshold, min_line_length, max_line_gap,flag=1)
    
    #	Create the combined image, show and save it
    color_edges = np.dstack((edges, edges, edges)) 
    finalimg = weighted_img(line_image,image)
    # plt.savefig("out"+name)
    
    #	debug with images to show
    plt.figure(figsize=[16, 9])
    for i, imgname in enumerate(['image', 'gray', 'blur_gray', 'edges', 'masked_edges','line_image']):
        showimg((2, 3, i+1), imgname, eval(imgname))
    

    ····在此基础之上,我们已经基本摸清楚了这些函数的具体用途和使用效果,那么我们可以基于上段函数来构建一个function,写定各参数,实现面向实时的单车道线检测处理。

    def process_image(image, ignore_mask_color = 255, rho = 1, theta = np.pi/180, threshold = 15, min_line_length = 25,max_line_gap = 25):
    	# gray
        gray = grayscale(image)
        
        # blur_gray
        blur_gray = gaussian_blur(gray,7)
        
        # edges
        edges = canny(blur_gray, 50, 150) 
        
        # region-of-interest
        imshape = image.shape
        mask = np.zeros_like(edges)   
        vertices = np.array([[(0,imshape[0]),(410, 330), (550, 330), (imshape[1],imshape[0])]], dtype=np.int32)
        masked_edges = region_of_interest(edges,vertices)
    
    	# creating a blank to draw lines on
        line_image = np.copy(image)*0       
    
        # Run Hough on edge detected image
        line_image = hough_lines(masked_edges, rho, theta, threshold, min_line_length, max_line_gap,flag=0)
    
        # Create the combined image, show and save it
        color_edges = np.dstack((edges, edges, edges)) 
        finalimg = weighted_img(line_image,image)
        return finalimg
    

    ····此时接入视频,查看结果.

    # Import everything needed to edit/save/watch video clips
    from moviepy.editor import VideoFileClip
    from IPython.display import HTML
    
    white_output = 'test_videos_output/solidWhiteRight.mp4'
    clip1 = VideoFileClip("test_videos/solidWhiteRight.mp4")
    white_clip = clip1.fl_image(process_image) #NOTE: this function expects color images!!
    %time white_clip.write_videofile(white_output, audio=False)
    

    在这里插入图片描述

    总结和拓展

    ····至此基于hough的单车道线检测已经完成了,无需gpu,只在cpu上跑可以达到40帧/s,满足实时性要求,算是非常好的结果,而且车道线检测结果非常稳定,只是偶尔会有错帧,而且hough变换只能基于直线来进行,弯道检测必须用其他方法。
    ····从优化角度去考虑,至少可以再加个平滑器,这样图像效果更棒,提高鲁棒性,不易受偶尔的错帧影响;无法应对复杂场景,可以考虑增加灭点特征,可以减少部分错误结果,提高算法鲁棒性;可以考虑增加跟踪器,提高算法结果的可靠性。
    ····快去试试吧~~

    如有侵权,请私戳~~感谢。


    1. https://www.cnblogs.com/finlay/p/3665302.html ↩︎

    2. https://blog.csdn.net/eastmount/article/details/82216380 ↩︎

    3. https://www.cnblogs.com/techyan1990/p/7291771.html ↩︎

    4. https://www.cnblogs.com/wlzy/p/7283579.html ↩︎

    5. https://blog.csdn.net/yuyuntan/article/details/80141392 ↩︎

    展开全文
  • 车道线检测paper

    2018-09-26 15:56:55
    车道线检测论文-paper.希望对这方面研究的相关人员有一定的帮助。
  • matlab 车道线检测

    热门讨论 2015-03-01 17:43:55
    matlab 车道线检测 基于改进的hough变换,区域生长法
  • 基于OPENCV的车道线检测,可以用来识别车道线。适合视觉开发及ADAS开发参考。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,045
精华内容 3,218
关键字:

车道线检测