实战:使用 OpenCV 的自动驾驶汽车车道检测(附代码)

机器学习实践系列之11 - OpenCV实战车道线检测 ADAS 在经过资本的一轮热炒之后已经不新鲜了,Mobile Eye的技术积累和效果也让很多童鞋叹为观止,然后奋起直指!        初学者为代表的童鞋,二话不说,上来就是霍夫变换,还是直接用opencv里带的,入门很好,实力一下就暴漏个底掉。又做了一番调研,发现了Hough变换的缺点,然后开始搞模板,形状匹配、轮廓提取、样本训练,效果仍旧不理想,无法应对恶劣天气、不能适应光线变化,总之鲁棒性 阅读详情


听说今天是七夕节?????老粉丝一定知道我一向是很宠粉的,七夕节也要给大家一个惊喜。答应我,看完这篇文章,文末有惊喜等着你~


一、边缘检测

我们将使用 Canny 进行边缘检测。如果你不确定这是什么,请查阅相关资料,对于后文的阅读会有帮助。

def canyEdgeDetector(image):
    edged = cv2.Canny(image, 50, 150)
    return edged

二、定义ROI

驾驶时,为了让汽车保持在车道上,只关注当前道路的下一个100米。此外,也不关心分隔线另一侧的道路。这就是我们定义的区域。我们隐藏图像中不必要的细节,只显示有助于我们找到车道的区域。

def getROI(image):
    height = image.shape[0]
    width = image.shape[1]
    # Defining Triangular ROI: The values will change as per your camera mounts
    triangle = np.array([[(100, height), (width, height), (width-500, int(height/1.9))]])
    # creating black image same as that of input image
    black_image = np.zeros_like(image)
    # Put the Triangular shape on top of our Black image to create a mask
    mask = cv2.fillPoly(black_image, triangle, 255)
    # applying mask on original image
    masked_image = cv2.bitwise_and(image, mask)
    return masked_image

1.我们已经定义了三角形 ROI,其坐标将根据你们在汽车上安装摄像头的位置而变化(尽量只使用图像中实际有助于车道检测的那部分)。

2.我们创建了一个与原始图像形状相同的黑色图像:

3.创建一个蒙版:然后我们使用cv2.fillPoly()将我们的三角形(带有白色线条)放在我们的黑色图像之上以创建一个蒙版。

4. 在我们的原始图像上应用蒙版以获得只有我们的 ROI 的裁剪图像。

此步骤的输出:

三、获取线

下一步是通过 ROI 以获取图像中的所有直线。cv2.HoughLinesP()可以实现这一目标,此函数返回它可以在输入图像中找到的所有直线的列表,每条线由 [x1, y1, x2, y2] 表示。

def getLines(image):
    lines = cv2.HoughLinesP(image, 0.3, np.pi/180, 100, np.array([]), minLineLength=70, maxLineGap=20)
    return lines

cv2.HoughLinesP() 的参数必须根据要求进行调整(尝试更改和调试最适合方法)。但我们认为上面的方法在大多数情况下都应该有效,此步骤的输出如下所示:

四、绘制线条

以下实用程序函数获取图像和线条列表,并在图像上绘制线条。(此步骤不接受来自 Step3 的任何输入。相反,这只是一个将从 Step5 调用的实用步骤,因此首先查看 Step5,并在需要时访问此步骤)。

def displayLines(image, lines):
    if lines is not None:
        for line in lines:
            x1, y1, x2, y2 = line.reshape(4) #converting to 1d array
            cv2.line(image, (x1, y1), (x2, y2), (255, 0, 0), 10)
    return image

我们定义了另一个效用函数来从它的参数(斜率和截距)中获取线坐标。需要注意的是:一条线由y=mx+c表示,其中 m 是斜率,c 是截距。

def getLineCoordinatesFromParameters(image, line_parameters):
    slope = line_parameters[0]
    intercept = line_parameters[1]
    y1 = image.shape[0]  # since line will always start from bottom of image
    y2 = int(y1 * (3.4 / 5))  # some random point at 3/5
    x1 = int((y1 - intercept) / slope)
    x2 = int((y2 - intercept) / slope)
    return np.array([x1, y1, x2, y2])

五、获取平滑的线条

一旦我们从步骤 3 中获得了线条,在这一步中,我们将这些线条分成 2 组(左和右)。如果你们注意到Step3的输出图像,则此步骤会将Line1和Line 2放入左侧组,将Line3放入右侧组。

分组后,我们找到该组的平均斜率(m)和截距(c),并尝试通过调用 getLineCoordinatesFromParameters() 并传递平均值 m 和平均值 c 为每个组创建一条线。

以下是完成所有这些工作的函数:

def getSmoothLines(image, lines):
    left_fit = []  # will hold m,c parameters for left side lines
    right_fit = []  # will hold m,c parameters for right side lines


    for line in lines:
        x1, y1, x2, y2 = line.reshape(4)
        parameters = np.polyfit((x1, x2), (y1, y2), 1)
        slope = parameters[0]
        intercept = parameters[1]


        if slope < 0:
            left_fit.append((slope, intercept))
        else:
            right_fit.append((slope, intercept))


    left_fit_average = np.average(left_fit, axis=0)
    right_fit_average = np.average(right_fit, axis=0)


    # now we have got m,c parameters for left and right line, we need to know x1,y1 x2,y2 parameters
    left_line = getLineCoordinatesFromParameters(image, left_fit_average)
    right_line = getLineCoordinatesFromParameters(image, right_fit_average)
    return np.array([left_line, right_line])

这是线条分组后图像的外观:


六、主要代码

一旦我们准备好了单独的函数,我们只需要在我们的主代码中调用它们,你就会在你的图像中检测到车道。

image = cv2.imread("3.jpg") #Load Image


edged_image = canyEdgeDetector(image)   # Step 1
roi_image = getROI(edged_image)         # Step 2


lines = getLines(roi_image)             # Step 3


smooth_lines = getSmoothLines(image, lines)    # Step 5
image_with_smooth_lines = displayLines(image, smooth_lines) # Step 4


cv2.imshow("Output", image_with_smooth_lines)
cv2.waitKey(0)

输出将如下所示:

Github代码链接:

https://github.com/pdhruv93/computer-vision/tree/main/lane-detection-self-driving

????七夕福利:【Python计算机视觉与深度学习实战】免费包邮送!

《Python计算机视觉与深度学习实战》立足实践,从机器学习的基础技能出发,深入浅出地介绍了如何使用 Python 进行基于深度学习的计算机视觉项目开发。开篇介绍了基于传统机器学习及图像处理方法的计算机视觉技术;然后重点就图像分类、目标检测、图像分割、图像搜索、图像压缩及文本识别等常见的计算机视觉项目做了理论结合实践的讲解;最后探索了深度学习项目落地时会用到的量化、剪枝等技术,并提供了模型服务端部署案例。
《Python计算机视觉与深度学习实战》适合有一定的Python 编程基础,初学深度学习的读者阅读。

具体的参与方式呢,我已经想好了,大家可以在评论区留言一下自己与另一位先生/小姐的爱情故事,或者呢在评论区留下对未来的那个他/她的期待与对爱情的看法!

我们将从评论区中选出5位最用心的读者,来赠送本次图书~

最后呢,推荐大家先加一下我们的运营小姐姐Beyonce,如果中奖了私信她发送收货地址就可以了,当然了如果你有什么想要的资料也可以问一下她有没有哦,有的话都是会免费送给你的~

机器视觉:ROI在机器视觉中的作用 ROI是图像中的一部分区域,它可能包含了特定的对象、特征或模式,是我们分析和处理的重点。ROI在图像处理中扮演着重要角色,特别是在模板匹配等应用中,它指定了一个特定的区域,使得图像处理函数只在该区域内进行操作,从而提高了处理效率和准确性‌。ROI是一个区域,可以是矩形的也可以是圆形的,通常用于指定图像中需要特别处理的区域。‌:通过设定ROI,图像处理函数只在该区域内进行操作,减少了不必要的计算量,从而提高了处理速度‌。‌:在模板匹配时,ROI作为匹配搜索的参考图像,提高了匹配的准确性和效率‌。 阅读详情

相关推荐

无人驾驶--车道线检测实战(附源码)

做完项目后写了个技术小结,供自己回顾也为他人学习提供参考。 另外准备建一个无人驾驶方面的微信交流群,有兴趣的朋友可以加我微信:wxl609278502 请注明: 姓名-单位/学校 项目描述: 使用opencv实时处理车载摄像机采集的道路图像,检测当前的车道,并计算出当前车辆偏离车道中心的距离,计算当前车道的曲率。 项目代码GitHub地址:https://g...

weixin_38746685的博客 6万+

3、自动驾驶学习笔记——目标检测算法概述

自动驾驶学习笔记

TonCC的博客 1774

opencv车道线检测

车道线检测,需要完成以下功能: 图像裁剪:通过设定图像ROI区域,拷贝图像获得裁剪图像 反透视变换:用的是室外采集到的视频,没有对应的变换矩阵。所以建立二维坐标,通过四点映射的方法计算矩阵,进行反透视变化。后因ROI区域的设置易造成变换矩阵获取困难和插值得到的透视图效果不理想,故没应用 二值化:先变化为灰度图,然后设定阈值直接变成二值化图像。 形态学滤波:对二值化图像进行腐蚀,去除噪点,然后对图像进

明镜止水的博客 4万+

一文掌握基于深度学习的自动驾驶小车开发(Pytorch实现,含完整数据和源码,树莓派+神经计算棒)

./lite/tools/build_android.sh --arch=armv7 --android_stl=c++_shared --with_cv=ON

你是怎么做到的?我为什么做不到 5万+

OpenCV实战案例——车道线识别

方法:在图像中,黑色表示0,白色为1,那么要保留矩形内的白色线,就使用逻辑与,当然前提是图像矩形外也是0,那么就采用创建一个全0图像,然后在矩形内全1,之后与之前的canny图像进行与操作,即可得到需要的车道线边缘。TIPs:使用霍夫变换需要将图像先二值化。

weixin_54627824的博客 2万+

使用OpenCV完成车道线检测功能

实验名称:车道线检测 本项目是基于反透视变换和Hough直线检测完成的。要理解反透视变换首先要理解摄像机坐标系,成像坐标系和图像坐标系的关系。 1st. 对原视频进行反透视变换,将视角转变为鸟瞰图。 2nd.对视频进行一些预处理,如腐蚀膨胀,平滑处理等,设置ROI,减少画面中车道线以外的干扰物的影响。 3rd. 进行Canny变换,检测出画面的边缘并且对图像自动进行二值化处理。 4th.所得图像进行Hough变换,通过阀值,线段最短长度,连接为线段的最长间隔的设定来检测出画面中存在的直线。 5th.直线筛选

梦想家林肯 5万+

Apollo自动驾驶入门-地图、定位、感知、预测、规划、控制

本文主要介绍了自动驾驶的几大模块,通过阅读本篇文章,可以对自动驾驶有一个简单的认识。Apollo自动驾驶入门-地图、定位、感知、预测、规划、控制

qq_45830323的博客 4793

Python+OpenCV实现车道线检测代码部分

实验时 使用的是python3.7+cv2,直接在Anaconda上面直接安装,代码在Jupyter上跑的,图片是老师给的(—.—) 经过各个滤波后,划定区域 : 最终合成的图像 : 最后实际上是先把篮框框内的两条线截出来,之后使用最小二乘拟合出两条直线,然后将其与原图合并,形成车道线的检测,当时写这个实验参考了许多优快云上,简书上,知乎上以及Github的一些开源代码,这...

Dr.sen的博客 6896

基于OpenCV 的车道线检测方法

车道线检测是图像处理运用到无人驾驶的一项技术,目前也过渡到了部分汽车上,高速公路的自动车道保持就是一个应用。 最近研究了两个基于车道检测的opencv的代码,先放链接: A.Udacity车道线检测代码 B.基于霍夫变换和kalman滤波车道线检测 ***A***中处理步骤如下: 1.使用提供的一组棋盘格图片计算相机校正矩阵(camera calibration matrix)和失真系数(...

weixin_40279184的博客 5565

基于OpenCV的车道线检测

本项目主要使用OpenCV库,对视频中的车道线进行识别。通过图像处理技术,实现对车道线的处理、检测,并在视频中准确标记出车道线的位置。实施思路如下:a. 视频处理:读取视频文件,并对视频中的每一帧进行处理。b. 图像转换:将视频帧从彩色模式转换为灰度模式,以便进行后续处理。c. 噪声去除:使用高斯模糊对图像进行去噪,提高边缘检测的准确性。d. 边缘检测:使用Canny算法进行边缘检测,找出图像中的所有边缘。

m0_53216153的博客 5411

使用OpenCV实现车道线检测

简介 计算机视觉在自动化系统观测环境、预测该系统控制器输入值等方面起着至关重要的作用。本文介绍了使用计算机视觉技术进行车道检测的过程,并引导我们完成识别车道区域、计算道路RoC和估计车道中心距离的步骤。 摄像机校准 几乎所有摄像机使用的镜头在聚焦光线以捕捉图像时都存在一定的误差,因为这些光线由于折射 在镜头边缘发生了弯曲。这种现象会导致图像边缘的扭曲。主要作用就是去除图像失真。 透视变换 检测车道的第一步是调整我们的视觉系统,以鸟瞰的角度来观察前方的道路,这就有助于计算道路的曲率,因此有助于我们预测未来几百

hallobike的博客 5434

OpenCV与图像处理实战(一):车道线检测

最简明的《OpenCV与图像处理》实战教程!

不积跬步,无以至千里! 1万+

opencv入门项目——车道线检测

Opencv入门项目——车道线检测,Canny边缘检测 - ROI - 霍夫变换 - 离群值过滤 - 最小二乘拟合 - 直线绘制 - 视频流读写

不想随波逐流的大学生一枚,我们每个人都在努力奔跑 1万+

使用 OpenCV 对车道进行实时检测

项目介绍 下图中的两条线即为车道: 我们的任务就是通过 OpenCV 在一段视频(或摄像头)中实时检测出车道并将其标记出来。其效果如下图所示: 这里使用的代码来源于磐怼怼大神,此文章旨在对其代码进行解释。 实现步骤 1、将视频的所有帧读取为图片; 2、创建掩码并应用到这些图片上; 3、图像阈值化; 4、用霍夫线变换检测车道; 5、将车道画到每张图片上; 6、将所有图片合并为视频。 代码实现 1、导入需要的库 import os import re import cv2 import numpy as

cocofisher的博客 5524

2月19 基于深度学习的车道线检测

基于深度学习的车道线检测 相比于haugh方法,DL方法性能提升角度: ROI区域的选择 图像处理过程的参数 处理速度(Haugh变换可能只有4.5-6帧/秒,要想实时,只能丢帧近似处理) 机器学习的子类——深度学习 近来,机器学习的发展产生了一个新的方向,即“深度学习”。 深度学习,就是传统的神经网联发展到了多隐藏层的情况。 2006年,Geoffrey Hinton在科学杂志《Science》上发表了一篇文章,论证了两个观点: 1.多隐层的神经网络具有优异的特征学习能力,学习得到的特征对数据有更本质的刻画,从而有利于可视化或分类; 2.深度神经网络在训练上的难度,可以通过“逐层初

CNN卷积神经网络手写数字识别实例及代码详解

本文的代码来自githup的Deep Learning的toolbox,是用Matlab实现的。感谢该toolbox的作者付出和分享。 我在应该该代码进行训练时,出现一些报错,如expand函数应用不对,flipall函数未定义等问题,对这些问题进行了修正,完成网络训练和验证。 本文mnist_uint8.mat的获取可以参照我的另一篇博客:MNIST数据库处理--matlab生成mnist_

VivienFu的专栏 6万+

使用Python+OpenCV实现自动驾驶汽车的车道线检测

对于所有想知道如何在一篇文章中涵盖这一概念的人,我想说,在你深入探索之前,事情听起来很复杂。我不会说这篇文章非常简单,但是它的确是建立在非常基础的计算机视觉概念之上的。先决条件是什么?具备...

深度学习与计算机视觉 3346

SIPVicious实战指南:从零开始掌握VoIP渗透测试(Kali Linux环境)

本文为SIPVicious实战指南,详细介绍了在Kali Linux环境下进行VoIP渗透测试的完整流程。从环境准备与工具安装开始,逐步讲解如何使用svmap扫描SIP服务器、svwar枚举PBX分机号,以及svcrack进行密码安全测试,并整合svreport生成报告。旨在帮助安全从业者从零开始,系统掌握这套经典开源工具,在授权范围内有效评估VoIP系统的安全性。

weixin_29327977的博客 539

【保姆级教程】基于OpenCV实现实时道路车道检测【附完整源码】

【保姆级教程】基于OpenCV实现实时道路车道检测【附完整源码】

阿旭的博客 1万+

NC65增加自定义参照并且参照数据要根据选择的财务组织过滤

1、首先定义一个参照类 package nc.pub.jzcm.ref; import nc.ui.bd.ref.AbstractRefModel; import nc.ui.bd.ref.IRefDocEdit; import nc.ui.bd.ref.IRefMaintenanceHandler; public class PMPrPayDefaultRefModel extends AbstractRefModel { public PMPrPayDefaultRefModel(){ ...

xyl的博客 3494

C#实现不占用串口的串口监听与侦听技术:高效监控串口数据的最佳实践

本文详细介绍了如何实现不占用串口的串口监听与侦听技术,解决了传统串口监听可能带来的串口占用问题。通过使用虚拟串口、外部监听工具或第三方库,我们可以高效地实现串口数据的捕获与处理,适用于各种工业控制、物联网和嵌入式开发的应用场景。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1675
上一篇: JupyterLab 3.0,极其强大的下一代notebook!
下一篇: 22:00,女友问我还要忙多久?我说一会儿!结果...
Wang_AI
博客等级 码龄12年 991粉丝 162原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值