近年来,基于人工智能的车道检测算法得到了广泛的研究。与传统的基于特征的方法相比,许多方法表现出了优越的性能。然而,当使用具有挑战性的图像时,其准确率通常仍在低80%或高90%之间,甚至更低。

准确可靠的车道检测是车道保持(LK)、变道自动化(LCA)和车道偏离警告(LDW)功能的关键特性。车道检测的研究可以追溯到20世纪80年代。世纪之交后,LDW和LK已经商业化,有些车辆甚至有LCA。DARPA和早期ADAS产品发起的自动驾驶挑战进一步推动了车道检测系统的发展。然而,由于不利的光照/天气条件和其他物体的存在,车道检测仍然是一个具有挑战性的问题。

车道检测可通过使用单目摄像机、立体摄像机、激光雷达等实现[4]。相机因其丰富的内容功能和低廉的价格而最受欢迎。

深度学习(DL)提出了一种新的数据驱动方法,并且比大多数基于特征的方法获得了更好的性能。虽然DL系统在许多应用中取得了优异的性能,但它们经常被用作"黑匣子",其性能没有保证。这限制了它们在安全关键任务中的应用,例如自动驾驶的车道检测。

我们也可以从静态的路标和路标中推断出路标和路标。基于特征的方法,如ELAS,通常在执行车道检测/跟踪任务之前预先检测所有可能的场景线索。对于基于卷积神经网络(CNN)的方法,这种场景信息在网络结构中是隐藏/隐含的。如果能先了解场景布局,将整个图像分割成几何区域,再聚焦于车道标识区域,则分类精度有望提高。

另一个重要的决定是CNN应该生成什么样的车道标签。许多现有的基于CNN的方法生成像素级的车道标记标志、车道区域掩码或参数化车道线。

对于大多数基于CNN的车道检测方法,输出是图像视图中像素级的车道实例掩码。然而,自主驾驶的期望输出是控制相关参数,即车辆横向偏移、航向角和曲率。为了填补这一空白,需要一些后处理程序,例如,反透视图(IPM)和车道模型拟合。由于车辆是运动的,道路并不总是平坦的,光是摄像机的内参数和外参数不足以计算摄像机与世界坐标之间的变换矩阵。需要更好的车道模型或附加程序,如消失点估计。

OpenCV+python实现的车道检测

深度学习加速了车道检测的精度,本文先介绍一下基于OpenCV的车道检测原理,当然精度虽然没有深度学习的高,但具体思想还是有类似的地方

import cv2import numpy as npdef canny(frame):  gray = cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)  blur = cv2.GaussianBlur(gray,(5,5),0)  canny = cv2.Canny(blur,50,150)  return canny

首先,我们建立几个子函数,canny子函数用来接收一个需要检测的照片,并使用高斯滤波函数对图像进行处理

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。

cv2.GussianBlur()函数

语法:GaussianBlur(src,ksize,sigmaX [,dst [,sigmaY [,borderType]]])-> ds

t——src输入图像;图像可以具有任意数量的通道,这些通道可以独立处理,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。

——dst输出图像的大小和类型与src相同。

——ksize高斯内核大小。 ksize.width和ksize.height可以不同,但​它们都必须为正数和奇数,也可以为零,然后根据sigma计算得出。

——sigmaX X方向上的高斯核标准偏差。

——sigmaY Y方向上的高斯核标准差;

如果sigmaY为零,则将其设置为等于sigmaX;

如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出;

为了完全控制结果,而不管将来可能对所有这些语义进行的修改,建议指定所有ksize,sigmaX和sigmaY。

然后使用cv2.Canny函数进行边缘检测

edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])

参数解释

· image:源图像

· threshold1:阈值1

· threshold2:阈值2

· apertureSize:可选参数,Sobel算子的大小

其中,较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的第一个阈值用于将这些间断的边缘连接起来。

函数返回的是二值图,包含检测出的边缘,最后子函数返回边缘检测的2值化图片

代码截图

def region_of_in(frame):  height = frame.shape[0]  polygons = np.array([[(0,height),(500,0),(800,0),(1300,550),(1100,height)]])  mask = np.zeros_like(frame)  cv2.fillPoly(mask,polygons,255)  masked = cv2.bitwise_and(frame,mask)  return masked

此子涵主要用于处理边缘检测后的图片,以便获取mask,只保留车道线

代码截图

def display_line(frame,lines):  line_image = np.zeros_like(frame)  if lines is not None:    for line in lines:      x1,y1,x2,y2 = line.reshape(4)      cv2.line(line_image,(x1,y1),(x2,y2),(0,255,0),1)    return line_image

此子函数主要用于检测车道线,并显示

代码截图

img = cv2.imread('7.jpg')image = np.copy(img)canny = canny(image)cropped = region_of_in(canny)lines = cv2.HoughLinesP(cropped,1,np.pi/180,100,minLineLength = 5, maxLineGap=300)line_image = display_line(image,lines)frame = cv2.addWeighted(image,0.8,line_image,1,1)cv2.imshow('canny',frame)cv2.waitKey(0)

我们利用3个子函数对一张照片进行车道检测,首先我们读取一张照片,使用canny子函数进行图片边缘车道检测,然后使用region_of_in子函数进行mask的检测

cv2.HoughLinesP()函数可以查找直线段,我们把边缘检测的图片给到cv2.HoughLinesP()检测图片中的直线,然后使用display子函数显示检测到的直线

cv2.HoughLinesP()函数原型:HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None) · image: 必须是二值图像,推荐使用canny边缘检测的结果图像; · rho: 线段以像素为单位的距离精度,double类型的,推荐用1.0 · theta: 线段以弧度为单位的角度精度,推荐用numpy.pi/180 · threshod: 累加平面的阈值参数,int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先用100试试· lines:这个参数的意义未知,发现不同的lines对结果没影响,但是不要忽略了它的存在 · minLineLength:线段以像素为单位的最小长度,根据应用场景设置 · maxLineGap:同一方向上两条线段判定为一条线段的最大允许间隔(断裂),超过了设定值,则把两条线段当成一条线段,值越大,允许线段上的断裂越大,越有可能检出潜在的直线段

代码截图

最后,我们使用图像混合加权实现图片的融合,主要函数为cv2.addWeighted函数

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst

参数说明· src1 – first input array.· alpha – weight of the first array elements.· src2 – second input array of the same size and channel number as src1.· beta – weight of the second array elements.· dst – output array that has the same size and number of channels as the input arrays.· gamma – scalar added to each sum.· dtype – optional depth of the output array; when both input arrays have the same depth,   dtype can be set to -1, which will be equivalent to src1.depth().

此函数可以用一下矩阵表达式来代替:

dst = src1 * alpha + src2 * beta + gamma;

由参数说明可以看出,被叠加的两幅图像必须是尺寸相同、类型相同的;并且,当输出图像array的深度为CV_32S时,这个函数就不适用了

以上检测方法,只能检测直线的车道线,当检测圆弧过渡的车道线,就不是那么适合了,使用此方法只能简单的对车道检测,有时其检测结果也会出现不尽人意的时候

车道检测

opencv 分割长度_opencv+python智能车道检测,助力无人驾驶相关推荐

  1. python仿真智能驾驶_opencv+python智能车道检测,助力无人驾驶

    近年来,基于人工智能的车道检测算法得到了广泛的研讨.与传统的基于特征的方法相比,许多方法表现出了优越的功能.但是,当使用具有应战性的图像时,其准确率通常仍在低80%或高90%之间,甚至更低. 准确牢靠 ...

  2. python视频人脸检测_OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  3. 基于opencv+python的车道检测技术

    针对自动驾驶系统的实际需求,我们需要一种能够兼顾速度.不同环境下高检测成功率和鲁棒性的车道识别算法.首先,因为停车场更多的是地下光线昏暗的情况需要提高车道线与周围环境的对比度,然后灰度化图像进行模糊降 ...

  4. python opencv 录制视频_OpenCV Python 录制视频

    学到实用OpenCV调用笔记本电脑的摄像头,并录制视频保存到本地硬盘的时候,出现了一点故障,那就是获取到的文件总是为0KB.经过一番查找,终于找到了解决办法. 调用摄像头 调用摄像头作为本实验的基础是 ...

  5. python使用opencv如何保存图片_OpenCV Python 保存图片

    本示例使用的OpenCV版本是:4.1.1 运行Python的编辑器:Jupyter notebook 示例目的 通过无损和有损的方式进行图片保存. 实现代码 1,加载图片 import cv2 # ...

  6. python opencv压缩图片_OpenCV Python 缩放图片

    By 凌顺 2019年9月12日 本示例使用的OpenCV版本是:4.1.1 运行Python的编辑器:Jupyter notebook 示例目的 使用OpneCV的cv2.resize()函数对图片 ...

  7. python中的opencv读取数字_opencv+python 机读卡识别之试错(一)模板匹配的数字识别...

    图像来源于第四部分的数字,用任意截图工具截取部分图像当作模板,比如这样: 将模板与图像对比,这个方法根据matchTemplate函数只能选出整幅图里最匹配的图像,并不能找出所有,若想找出所有,必须不 ...

  8. CondLaneNet:基于条件卷积的自顶向下车道检测框架

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 小黑导读 论文是学术研究的精华和未来发展的明灯.小黑决心每天为大家带来经典或者最新论文的解读和分享,旨 ...

  9. Python 搭建车道智能检测系统

    作者 | 李秋键 责编 | 寇雪芹 出品 | AI科技大本营(ID:rgznai100) 引言: 本文将利用opencv实现对复杂场景下车道线的实时检测:所使用的图像处理方法主要是在读取图片的基础上, ...

最新文章

  1. linux之ifconfig、ifup、ifdown
  2. IntelliJ IDEA 15发布
  3. MFC BEGIN_MESSAGE_MAP()
  4. CityEngine如何生成隧道
  5. Python学习笔记10:内建结构
  6. MyBatis-Plus学习
  7. oracle数据库使用odbc导出到access失败
  8. qgis自定义符号库
  9. 【性能测试】全链路压测
  10. Redis下载及安装(windows版)
  11. pageadmin 网站建设教程:如何添加自定义页面
  12. 麦客CEO李卉:实践证明肯钻营的“小而美”亦动人|企服三会系列报道
  13. Rtabmap 视觉建图与导航 Ubuntu 18.04 Kobuki
  14. Qt中提示“常量中有换行符“的解决方法
  15. uni-app开发经验分享二十二: uni-app大转盘思路解析
  16. 史玉柱10大广告法则
  17. python代码编写工具_编写更好的Python代码的终极指南
  18. java 实现登录超时,Java-实现异地登陆和超时登陆
  19. Linux网络 远程访问及控制
  20. Centos7下bash命令自动补全功能安装

热门文章

  1. zsh关于.zprofile .zlogin .zshrc .zshenv文件中环境变量的加载
  2. 两台电脑怎么共享文件
  3. 抓包工具Charles使用技巧
  4. php 命令行打印换行符_如何在命令行输出中打印换行符
  5. git 代理 git_五分钟解释Git的要点
  6. javascript布尔值_JavaScript布尔值通过上法庭进行解释
  7. chrome关闭自动升级_为什么Chrome的自动完成功能不安全以及如何将其关闭
  8. 第一部linux手机,手机界再掀风波,英特尔力争在下一部手机中抢得一席之地
  9. ubuntu16.04下安装nodejs
  10. Oracle(二):查询、函数、集合运算