当前位置: 首页 > news >正文

[python]基于opencv实现的车道线检测

【检测原理】

一、首先进行canny边缘检测,为获取车道线边缘做准备

二、进行ROI提取获取确切的车道线边缘(红色线内部)

三、利用概率霍夫变换获取直线,并将斜率正数和复数的线段给分割开来

四、离群值过滤,剔除斜率相差过大的线段

五、最小二乘拟合,实现将左边和右边的线段互相拟合成一条直线,形成车道线

六、绘制线段

【代码解读】

LaneDetector 类包含了几个用于车道线检测的关键方法。这些方法分别用于将图像转换为灰度图、应用高斯模糊、应用Canny边缘检测以及定义和应用感兴趣区域(ROI)。以下是这些方法的详细解释:

  1. grayscale(self, img):
    • 这个方法接收一个彩色图像作为输入(通常是BGR格式),然后使用cv2.cvtColor函数将其转换为灰度图像。
    • 转换后的图像只有一个颜色通道,像素值范围通常是0到255,其中0表示黑色,255表示白色。
  2. canny(self, img, low_threshold, high_threshold):
    • 这个方法接收一个灰度图像和两个阈值作为输入。
    • 使用cv2.Canny函数来检测图像中的边缘。这个函数使用两个阈值来检测强弱边缘,并返回一个二值图像,其中边缘用白色像素表示。
  3. gaussian_blur(self, img, kernel_size):
    • 这个方法接收一个图像和一个核大小作为输入。
    • 使用cv2.GaussianBlur函数对图像进行高斯模糊,以减少图像中的噪声和细节,这对于边缘检测等后续处理步骤是有益的。
  4. region_of_interest(self, img, vertices):
    • 这个方法接收一个图像和一个由顶点组成的列表(通常是多边形)作为输入。
    • 创建一个与输入图像大小和类型相同的零矩阵作为遮罩。
    • 根据输入图像是彩色还是灰度,设置用于填充遮罩的颜色。对于彩色图像,这是一个三通道(或四通道,如果包括透明度)的元组,所有通道的值都设置为255(白色)。对于灰度图像,它只是一个标量值255。
    • 使用cv2.fillPoly函数在遮罩上填充多边形内部,将多边形内部的像素设置为指定的填充颜色。
    • 使用cv2.bitwise_and函数将输入图像和遮罩进行按位与操作,只保留遮罩中非零像素对应的图像部分。这实际上是将图像裁剪到多边形定义的ROI。

这个方法中的vertices参数应该是一个包含多个点的列表,这些点定义了多边形的顶点。每个点都是一个包含两个坐标(x, y)的元组。例如,对于梯形ROI,vertices可能看起来像这样(取决于图像的尺寸和所需的梯形大小):

vertices = [ [(x1, y1), (x2, y2), (x3, y3), (x4, y4)] # 四个顶点的坐标 ]

请注意,vertices实际上是一个列表的列表,因为cv2.fillPoly函数可以接受多个多边形,但在这个上下文中,我们只使用一个多边形来定义ROI。

这些方法构成了车道线检测算法的前置处理步骤。要完成整个车道线检测流程,您还需要实现直线检测(通常使用霍夫变换)和直线拟合(例如使用最小二乘法)。此外,您可能还需要实现一些后处理步骤,如过滤掉不相关的线、将检测到的线绘制在原始图像上等。

  1. hough_lines 函数:这个函数接收一个Canny边缘检测后的图像、ρ值、θ值、阈值、最小线段长度和最大线段间隔作为输入,并返回一个画有霍夫线的图像。霍夫变换用于检测图像中的直线。
  2. weighted_img 函数:这个函数接收一个带有霍夫线的图像、初始图像以及三个权重参数(α、β、λ)作为输入,并返回一个根据给定公式计算得出的加权图像。这个公式将初始图像、带有霍夫线的图像以及一个常数λ相加,其中α和β是权重参数。
  3. filter_colors 函数:这个函数接收一个图像作为输入,并返回一个只包含黄色和白色像素的图像。它首先过滤出白色像素,然后过滤出黄色像素,最后将两个过滤后的图像以相同的权重相加。

这些函数一起工作,首先使用Canny边缘检测和霍夫变换检测车道线,然后使用加权图像合并原始图像和检测到的车道线,最后过滤出黄色和白色像素以进一步处理。

【效果展示】

【代码调用】

图像检测或者视频检测调用非常简单

    ld = LaneDetector()# ld.detect_image('test_images/solidWhiteCurve.jpg')ld.detct_video('solidWhiteRight.mp4')

【测试环境】

anaconda3+python3.8

opencv-python==4.7.0.68

【源码下载】 

https://download.csdn.net/download/FL1623863129/88804438

相关文章:

  • 问题:0xc8前面加(byte) #人工智能#学习方法的原因是因为0xc8大于??????????? 。 #微信#其他#微信
  • 宠物空气净化器哪个牌子好?养猫家庭如何挑选宠物空气净化器?
  • WebSocket基础详解
  • 房屋租赁系统-java
  • Win32 SDK Gui编程系列之-- 读写初始化文件(INI文件)
  • vector类的模拟实现
  • 学习Spring的第十六天
  • 风行智能电视G32Y 强制刷机升级方法,附刷机升级数据MstarUpgrade.bin
  • Node.js-1
  • visual studio注册码
  • 20240202在WIN10下使用whisper.cpp
  • mysql入门到精通005-基础篇-约束
  • 大规模机器学习简介
  • Netty源码系列 之 EventLoop run()方法 源码
  • Swift Combine 发布者订阅者操作者 从入门到精通二
  • JavaScript 奇技淫巧
  • JSONP原理
  • mongodb--安装和初步使用教程
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • 翻译:Hystrix - How To Use
  • 好的网址,关于.net 4.0 ,vs 2010
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 码农张的Bug人生 - 见面之礼
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 深入浅出Node.js
  • 使用 @font-face
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 走向全栈之MongoDB的使用
  • 最近的计划
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​secrets --- 生成管理密码的安全随机数​
  • ​力扣解法汇总946-验证栈序列
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 透过事物看本质的能力怎么培养?
  • #pragma 指令
  • $.ajax()方法详解
  • (1)常见O(n^2)排序算法解析
  • (c语言)strcpy函数用法
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (转)socket Aio demo
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .Net mvc总结
  • .NET 表达式计算:Expression Evaluator
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 设置默认首页
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET程序员迈向卓越的必由之路
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • @WebService和@WebMethod注解的用法
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具