[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

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

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

相关文章

大数据平台-可视化面板介绍-Echarts

应对现在数据可视化的趋势,越来越多企业需要在很多场景(营销数据,生产数据,用户数据)下使用,可视化图表来展示体现数据,让数据更加直观,数据特点更加突出。 目录 01-使用技术 02- 案例适配方案 03-基础…

【大厂AI课学习笔记】1.4 算法的进步(4)关于李飞飞团队的ImageNet

第一个图像数据库是ImageNet,由斯坦福大学的计算机科学家李飞飞推出。ImageNet是一个大型的可视化数据库,旨在推动计算机视觉领域的研究。这个数据库包含了数以百万计的手工标记的图像,涵盖了数千个不同的类别。 基于ImageNet数据库&#xf…

Android之命令行烧写OTA镜像(一百八十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

【Leetcode】1690. 石子游戏 VII

文章目录 题目思路代码结果 题目 题目链接 石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 。 有 n 块石子排成一排。每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的石头,并获得与该行中剩余石头值之 和 相…

Vue基础知识七

一 路由 1.1 生活里的路由与路由器 是为了实现多台设备上网 1.2 程序里的路由与路由器 是为了实现导航区与展示区来回切换; SPA单页面应用:就像前几章节里的项目,整个项目只有一个html文件; 案例 注意,最开始的时候…

嵌入式学习 Day18

Linux软件编程: 1.Linux: 操作系统的内核 1.管理CPU 2.管理内存 3.管理硬件设备 4.管理文件系统 5.任务调度 2.Shell: 1.保护Linux内核(用户和Linux内核不直接操作,通过操作Shell,Shell和内核交互) 2.命令解释器 3…

STM32--SPI通信协议(2)W25Q64简介

一、W25Q64简介 1、W25Qxx中的xx是不同的数字,表示了这个芯片不同的存储容量; 2、存储器分为易失性与非易失性,主要区别是存储的数据是否是掉电不丢失: 易失性存储器:SRAM、DRAM; 非易失性存储器&#xff…

红队渗透靶机:LORD OF THE ROOT: 1.0.1

目录 信息收集 1、arp 2、nmap 3、knock 4、nikto 目录探测 1、gobuster 2、dirsearch WEB sqlmap 爆库 爆表 爆列 爆字段 hydra爆破 ssh登录 提权 信息收集 内核提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, ty…

参考数据集INRIA Holidays dataset

Download datasets 很贴心,MATLAB访问代码: % This function reads a siftgeo binary file % % Usage: [v, meta] = siftgeo_read (filename, maxdes) % filename the input filename % maxdes maximum number of descriptors to be loaded % (default=unlimit…

【微服务】Spring Boot集成ELK实用案例

推荐一款我一直在用国内很火的AI网站,包含GPT3.5/4.0、文心一言、通义千问、智谱AI等多个AI模型,支持PC、APP、VScode插件同步使用,点击链接跳转->ChatGPT4.0中文版 一、前言 在现代软件开发中,微服务架构已成为一种流行趋势。…

1 月 30 日算法练习-数论

唯一分解定理 唯一分解定理指的是:对于任意一个>1的正整数,都可以以唯一的一种方式分解为若干质因数的乘积。 x p 1 k 1 ⋅ p 2 k 2 ⋅ … ⋅ p m k m x p_1^{k_1} \cdot p_2^{k_2} \cdot \ldots \cdot p_m^{k_m} xp1k1​​⋅p2k2​​⋅…⋅pmkm​…

Kubernetes集群搭建

一、概述 Kubernetes是一个Google开源的全新的分布式容器集群管理系统,由于从第一个字母到字母s中间有8个字母,所以简称K8s。 二、准备 ip角色内存192.168.187.130master4G192.168.187.131node2G192.168.187.132node2G 小提示: 设置静态i…

信号传输中串扰的影响.

1.导线间的串扰 当导线之间发生串扰时,一根导线上的信号会影响到另一根信号线,给连接的电路造成干扰。这种现象通常发生在平行的导线之间。在设计设备的布线时,特别要注意低电平模拟信号的传输问题。附近导线对其的串扰常常是系统性能下降的主要原因。因此在布线设计时,必须…

seq2seq编码器-解码器实现

我们在之前的文章快速上手LSTM-CSDN博客中提及了RNN的几种不同的类型,其中有同步的 many to many 的根据视频的每一帧对视频分类任务,以及异步的 many to many 文本翻译。对于这种输入和输出不等长的序列,我们采用seq2seq(sequenc…

一步步成为React全栈大师:从环境搭建到应用部署

文章目录 第一步:环境搭建第二步:了解React基础第三步:组件与路由第四步:状态管理第五步:接口与数据交互第六步:样式与布局第七步:测试第八步:构建与部署《深入浅出React开发指南》内…

【面试官问】Redis 持久化

目录 【面试官问】Redis 持久化 Redis 持久化的方式RDB(Redis DataBase)AOF(Append Only File)混合持久化:RDB + AOF 混合方式的持久化持久化最佳方式控制持久化开关主从部署使用混合持久化使用配置更高的机器参考文章所属专区

React 面试题

1、组件通信的方式 父组件传子组件:通过props 的方式 子组件传父组件:父组件将自身函数传入,子组件调用该函数,父组件在函数中拿到子组件传递的数据 兄弟组件通信:找到共同的父节点,用父节点转发进行通信 …

一键转换MOV至MP3:轻松删除原视频,释放存储空间!

你是否曾经有一个MOV格式的视频文件,想要提取其中的音频却苦于没有合适的工具?现在,有了我们的全新视频剪辑工具,这个烦恼全部消失!我们为你提供一键式解决方案,将MOV视频文件快速转换为MP3音频格式。 首先…

基于单片机的造纸纸浆液位控制系统结构设计

摘要:为适应无人化与高效化制浆造纸生产体系,造纸企业趋于以嵌入式技术优化造纸过 程中的纸浆液位控制系统,以单片机与传感器相互耦合实现纸浆液位控制。本文基于单片机 设计了造纸纸浆液位控制系统,其结构由控制模块、信息采集模块、物联网模…

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

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