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

news2024/9/24 7:17:20

【检测原理】

一、首先进行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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1430536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp 高德地图显示

1. uniapp 高德地图显示 使用前需到**高德开放平台(https://lbs.amap.com/)**创建应用并申请Key   登录 高德开放平台,进入“控制台”,如果没有注册账号请先根据页面提示注册账号   打开 “应用管理” -> “我的应用”页面…

Springboot集成Camunda并完成一条流程实例

💖专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据,完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧😘 💖设计流程定…

028 方法的重载

方法重载的定义 使用案例 public static void main(String[] args) {// 匹配到max(int a, int b)System.out.println(max(1, 3));// 匹配到max(double a, double b)System.out.println(max(1L, 3L));// 匹配到max(double a, double b, double c, double d),int自动…

SQL 函数(十二)

SQL 函数(十二) 一、函数分类 1.1 单行函数 单行函数仅对单个行进行运算,并且每行返回一个结果。 常见的函数类型: 字符、数字、日期、转换 1.2 多行函数 多行函数能够操纵成组的行,每个行组给出一个结果&#x…

【拜年神器】AI写真保姆级教程

1. 介绍 废话不说,先上图看效果 功能简介 上传几张自己的照片,训练之后,就能生成各种风格的AI写真照,主要有无限风格写真、固定模板写真、AI虚拟试衣、人物说话视频四个类别 无限风格写真 固定模板写真 证件照 工作照 婚纱…

k8s中cert-manager管理https证书

前言 目前https是刚需,但证书又很贵,虽然阿里云有免费的,但没有泛域名证书,每有一个子域名就要申请一个证书,有效期1年,1年一到全都的更换,太麻烦了。经过搜索,发现了自动更新证书神器cert-manager;当然cert-manager是基于k8s的。 安装采用Helm方式 Chart地址: ht…

萝卜视频源码前后端带视频演示

萝卜影视源码前端是用JAVA开发的全原生APP源码,后端用的是二次开发的苹果CMS,支持局域网投屏,视频软解硬解,播放器自带弹幕功能。支持解析官方视频,支持M3U8,MP4。 开屏广告,全局广告&#xff0…

lava学习-接口

接口-Interface 1.什么是接口? 例:构造器,代码块在接口中统统没有,也不能创建对象 构造器的使用-----实现类 例:下图中的B类就是一个 实现类 2.接口的好处 继承只能单继承,而接口可以弥补类单继承的不足&am…

iPad“粘贴自”字样不消失解决办法

iPad“粘贴自”字样不消失解决办法 好无语,写论文主要就靠iPad看资料,复制粘帖的时候卡死搞得我无敌焦躁,问了🍎支持的客服才解决,方法如下:1.音量上键按一下 2.音量下键按一下 3.一直按开关机键直到出现苹…

备战蓝桥杯---搜索(应用入门)

话不多说,直接看题: 显然,我们可以用BFS,其中,对于判重操作,我们可以把这矩阵化成字符串的形式再用map去存,用a数组去重现字符串(相当于map映射的反向操作)。移动空格先找…

Nicn的刷题日常之打印水仙花数

目录 1.题目描述 2.解题思路 3.解题 1.题目描述 求出0~100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则1…

使用C#读取PDF中所有文本内容

先安装如下包 using iTextSharp.text.pdf; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text;namespace ReadPdfText {class Program{static void Main(string[] args){string path "0017_审判流程管理信息表2…

HDMI2.1之eARC简介-Dolby Atmos和DTS:X

文章目录 eARC目的更大的带宽更高质量音频支持对象型音频与CEC(Consumer Electronics Control)的兼容性: 适应流媒体发展Dolby AtmosDTS:X高分辨率音频更高的音频位深度和采样率低延迟音频 对象型音频格式独立对象三维定位动态音场适应性和灵…

【大数据技术攻关专题】「Apache-Flink零基础入门」手把手+零基础带你玩转大数据流式处理引擎Flink(基础加强+运行原理)

手把手零基础带你玩转大数据流式处理引擎Flink(运行机制原理加深) 前提介绍运行Flink应用运行机制Flink的两大核心组件JobManagerTaskManagerTaskSlot Flink分层架构Stateful Stream ProcessingDataStream和DataSetDataStream(数据流&#xf…

顺序表:数据结构的建筑积木

朋友们大家好啊,本节内容我们进入数据结构的第二节,顺序表有关内容,同步我们会学习计组原理与cpp相关知识,求三连啊! 本节我们重点探讨动态顺序表关于插入数据和删除数据的多种情况的分析 顺序表 线性表顺序表静态顺序…

浪漫的通讯录(顺序表篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能…

[python] os.fork

文章目录 使用 os.fork()注意事项示例安全使用 os.fork()底层原理 os.fork() 是 Python 中用于 Unix/Linux 系统的一个函数,它在当前进程中创建一个子进程。这个函数是 os 模块的一部分,直接调用了 Unix/Linux 系统的 fork 系统调用。fork 系统调用非常基…

Wiringpi不支持树莓派5了, Wiringpi官方好像不更新了

买了树莓派5才知道,Wiringpi不支持树莓派5了, Wiringpi官方好像不更新了。那用什么来替代呢? 通过资料查询,libgpiod 支持io控制; https://github.com/brgl/libgpiod //gpio库 gpiodetect #检测支持的io 可以看到&a…

SpringBoot注解--05--注解@Valid

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1 前言1.1 Bean Validation1.2 Valid实际案例1.3 Spring 中的 valid 注解 2 Valid 详解2.1 源码解析2.2 参数校验使用注解2.3 具体使用流程POST 则可以以实体对象为…

再谈Redis三种集群模式:主从模式、哨兵模式和Cluster模式

总结经验 redis主从:可实现高并发(读),典型部署方案:一主二从 redis哨兵:可实现高可用,典型部署方案:一主二从三哨兵 redis集群:可同时支持高可用(读与写)、高并发,典型部署方案:三主三从 一、概述 Redis 支持三种集群模式,分别为主从模式、哨兵模式和Cluster模式。…