Advertisement

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

阅读量:

近年来围绕人工智能驱动的车道检测技术的研究取得了显著进展。相较于传统特征依赖型的传统方法而言,这些新型技术普遍展现了卓越性能。然而,在面对具有挑战性的图像数据时,其分类精度一般维持在80%以下或接近90%,甚至更低。

准确可靠的车道检测是实现车道保持(LK)、变道辅助(LCA)以及车道偏离警报(LDW)等功能的关键特性。车道检测的研究可追溯至20世纪80年代末期。进入21世纪后,LDW技术和LK逐步得到商业化应用,部分车辆配备了LCA系统。DARPA及早期的ADAS产品开发背景推动了自动驾驶竞赛,从而促进了车道检测技术的进步。然而,在复杂的天气光照条件及障碍物存在的情况下,这一技术依然面临诸多困难

a0190915f0195d1f06674d69ba698ecd.gif

opencv+python智能车道检测,助力无人驾驶-1.jpg (36.75 KB, 下载次数: 0)

2020-12-18 21:12 上传

基于单目摄像头、平面摄像头以及激光雷达等多种手段进行车道检测的研究已获得广泛的关注与应用[4]。尽管价格相对较低且功能较为基础,但相机凭借其卓越的图像捕捉能力依然成为图像处理领域中的重要工具

深度学习(DL)发展出一种新型的数据驱动型方法,并较大多数基于特征的方法实现了更优效能。尽管DL系统在多数应用场景中展现出卓越效能,但这些系统往往被设计为"黑箱装置"(即"黑匣子"),其内部工作原理不透明且功能不可靠性难以保证。这种局限性使得它们难以应用于需要严格安全管控的安全关键任务中。例如,在自动驾驶技术中的车道检测功能就受到这一限制。

a0190915f0195d1f06674d69ba698ecd.gif

opencv+python智能车道检测,助力无人驾驶-2.jpg (40.95 KB, 下载次数: 0)

2020-12-18 21:12 上传

我们也可以从静止状态的道路标志及其标记物中推导出道路标志的存在情况。基于特征的方法(如ELAS)通常会在执行车道检测/跟踪任务之前先探测所有相关场景线索。对于基于卷积神经网络(CNN)的方法而言,在网络架构中这种场景信息以隐式的方式存在。若能提前理解场景规划并将其整个图像分割为几何区域,则有助于提升分类精度

a0190915f0195d1f06674d69ba698ecd.gif

opencv+python智能车道检测,助力无人驾驶-3.jpg (30.49 KB, 下载次数: 0)

2020-12-18 21:12 上传

一项关键的决定指出:基于深度学习技术的应用场景中,在自动驾驶系统中实现精准的道路标线识别具有重要意义

a0190915f0195d1f06674d69ba698ecd.gif

opencv+python智能车道检测,助力无人驾驶-4.jpg (46.22 KB, 下载次数: 0)

2020-12-18 21:12 上传

基于CNN的多数车道检测技术其输入通常表现为图像视角下的像素级别的车道实例掩膜然而在自动驾驶领域这一理想状态并未得到满足因为自动驾驶系统关注的是涉及的关键参数包括车辆横向偏移转向角和曲率等动态特性为此开发有效的后处理程序显得尤为重要例如反透视图(IPM)和平流道模型拟合这类程序能够帮助更好地理解环境由于车辆具有动态特性道路表面并非始终平整仅凭摄像头内部参数和外部参数无法推导出摄像头与世界坐标系之间的变换矩阵因此需要开发更为先进的处理手段或引入额外算法如消失点估计

OpenCV+python完成的车道检测

深度学习提升了车道检测的精度。本文通过介绍基于OpenCV的技术基础来阐述车道检测的基本原理。然而,在细节上与基于深度学习的方法相比,在算法复杂度与实现难度上仍有一定差距,并且其核心思路却有不少共通之处。

导入OpenCV库并命名为cv2。
导入numpy库并命名为np。
定义名为canny的函数接受输入帧。
将输入图像转换为灰度图像。
对灰度图像应用高斯模糊滤波器,在5x5窗口上平滑图像。
对处理后的图像执行Canny边缘检测算法。
使用低阈值为50、高阈值为150参数设置检测边界。
将计算得到的结果返回。

第一步我们开发了若干子函数模块其中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相反。

—Gaussian kernel size parameter. The width and height of the ksize parameter can be different, but they must be odd negative integers or zero, which will be determined based on the sigma value.

——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算子的大小

此外,在默认条件下如果遇到复杂场景或者细节纹理丰富的图像,则会导致较多伪边或者误报现象。”

该函数被分配到二值图中,并且其中包含了被检测出的边缘信息。随后,在处理流程中,最终一个子函数负责处理来自边缘检测阶段的二值化图像。

a0190915f0195d1f06674d69ba698ecd.gif

opencv+python智能车道检测,助力无人驾驶-5.jpg (22.51 KB, 下载次数: 0)

2020-12-18 21:12 上传

代码截图

执行以下步骤对输入帧进行区域掩膜提取:

  1. 计算帧的高度并获取其形状信息
  2. 定义一个多边形区域的顶点坐标
  3. 创建与原始帧尺寸相同的空白掩模
  4. 使用多边形填充掩模
  5. 应用掩膜与原始帧的按位与运算以提取所需区域
  6. 返回处理后的结果

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

a0190915f0195d1f06674d69ba698ecd.gif

opencv+python智能车道检测,助力无人驾驶-6.jpg (31.13 KB, 下载次数: 0)

2020-12-18 21:12 上传

代码截图

def process_lines(frame(lines):
background = np.zeros_like(frame)
if lines is not None:
for line in lines:
x1(y1)x2(y2) = line.reshape(4)
cv\w+line(background,(x\w+,y\w+),(x\w+,y\w+),(0.9999999999997673)) , (0.7687468374886865 , 0.684387536636434)) , 1
return background

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

a0190915f0195d1f06674d69ba698ecd.gif

opencv+python智能车道检测,助力无人驾驶-7.jpg (25.98 KB, 下载次数: 0)

2020-12-18 21:12 上传

代码截图

读取图像 img 使用 OpenCV 的 cv2.imread 函数加载图片文件 "7.jpg";生成并赋值 image 变量为 img 的深度拷贝;将 image 传递给 canny 函数生成边缘检测结果 canny;提取 canny 输出中的区域 of interest 到 cropped 变量;利用 HoughLinesP 方法检测 cropped 区域内的直线特征,并将结果存储在 lines 变量中;生成叠加了 original image 和 detected lines 的 result image 并赋值给 line_image;将 original image、detected lines 和 result image 进行加权叠加生成 final frame 并显示在屏幕上;等待按键后退出程序

我们利用三个子函数对一张图片进行车道检测。首先我们读取一张图片并使用Canny子函数进行边缘车道检测;接着我们使用Region_of_in子函数进行mask的检测。

该函数用于识别图像中的直线段。将经过边缘检测的图像传入cv2.HoughLinesP()进行处理。最后调用display函数以展示检测到的直线。

cv2.HoughLinesP()函数原型:HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None) · 该函数要求输入图像为二值图; · 其中rho表示线段间隔的精度(以像素为单位),推荐设置为1.0; · theta用于设定线段的角度精度(以弧度计),推荐使用numpy.pi/180; · threshold为累加平面的阈值参数(整数类型),只有当累加平面数值超过该阈值时才会被检测出线段;建议先尝试将阈值设为100; · lines参数的具体作用尚未明确说明,并且其取值对函数运行效果影响较小; · minLineLength:线段的最小长度(以像素计),根据具体应用场景进行设置; · maxLineGap:同一方向上两条相邻线段被认为是一条直线的最大允许断裂距离(以像素计),当实际断裂距离超过设定的最大允许断裂距离时,则将这两条线段视为一条直线;建议设置较大数值以便能够检测潜在的直线特征

a0190915f0195d1f06674d69ba698ecd.gif

opencv+python智能车道检测,助力无人驾驶-8.jpg (37.73 KB, 下载次数: 0)

2020-12-18 21:12 上传

代码截图

在最后阶段我们采用图像融合处理技术,并通过混合加权方法实现图片的交织效果。其中主要辅助功能为cv2.addWeighted函数

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
该函数用于将两个输入图像按权重进行叠加。
第一个输入数组为src1。
alpha表示第一个数组元素的重要程度。
第二个输入数组src2与第一个数组具有相同的尺寸和通道数量。
beta表示第二个数组元素的重要程度。
输出结果存储在输出数组dst中。
该输出数组具有与输入相同尺寸及通道数量。
gamma是每个总和中添加的一个标量值。

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

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

通过参数分析可知,在叠加在一起的情况下(即尺寸大小不同且类型不同),若输入图像array的深度设置为CV_32S,则该函数将不再适用

当前所采用的检测手段仅能适用于直线路段。对于曲线或圆弧形道路的情况而言,则显得不够理想。采用这种方法仅能完成基础性的车道识别过程,在某些情况下会导致识别效果欠佳。

a0190915f0195d1f06674d69ba698ecd.gif

opencv+python智能车道检测,助力无人驾驶-9.jpg (54.8 KB, 下载次数: 0)

2020-12-18 21:12 上传

车道检测

全部评论 (0)

还没有任何评论哟~