从零开始详解OpenCV车道线检测

前言

车道线检测是智能驾驶和智能交通系统中的重要组成部分,对于提高道路安全、交通效率和驾驶舒适性具有重要意义。在本篇文章中将介绍使用OpenCV进行车道线的检测

在这里插入图片描述

详解

导入包

import cv2
import matplotlib.pyplot as plt
import numpy as np

读入图像并灰度化

img = cv2.imread('road.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(gray, cmap='gray')
plt.show()

在这里插入图片描述

二值化

thresh, im = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)
plt.imshow(im, cmap=plt.cm.gray)
plt.show()

在这里插入图片描述

边缘检测

output = cv2.Canny(im, 180, 255)
plt.imshow(output, cmap='gray')
plt.show()

在这里插入图片描述
cv2.Canny()函数的语法和参数说明:

语法:
	edges = cv2.Canny(image, threshold1, threshold2[, apertureSize[, L2gradient]])
参数:
	image:输入图像,通常是8位灰度图像。
	threshold1:第一个阈值。边缘梯度值高于这个阈值的像素被视为边缘。
	threshold2:第二个阈值。在这两个阈值之间的边缘会被认为是强边缘,而低于threshold1但高于threshold2的边缘被认为是弱边缘。只有与强边缘相连的弱边缘才会被认为是真正的边缘。
	apertureSize(可选):Sobel算子的孔径大小,用于计算梯度。默认是3。
	L2gradient(可选):一个布尔值,指定是否使用L2范数来计算梯度幅度。如果为True,则使用L2范数;否则,使用L1范数(这更快)。默认是False。
返回值:
	edges:输出图像,包含检测到的边缘。

掩码操作

从边缘检测的结果看,仍然存在很多干扰区域,我们可以通过掩码操作除去这一部分的干扰。

在获取掩码的步骤中,首先构建一个全为0的掩码,即黑色部分。然后使用cv2,fillPoly来绘制掩码中值为255的白色部分。

polygons = np.array([[(0, output.shape[0]), (0, 400), (output.shape[1]//2, 100), (output.shape[1], 400), (output.shape[1], output.shape[0])]])
mask = np.zeros_like(output)
cv2.fillPoly(mask, polygons, 255)

cv2.fillPoly用于在图像上绘制并填充多边形

语法:
	cv2.fillPoly(img, pts, color[, lineType[, shift[, offset]]])
参数:
	img:原图像。
	pts:多边形的顶点坐标列表。其中每个元素是一个二维坐标点(即顶点的坐标)。
	color:填充颜色。这是一个三元组,表示 BGR 颜色。
	lineType:线条类型。默认值为 cv2.LINE_8, 可选参数:
		cv2.LINE_8(8-连通)
		cv2.LINE_4(4-连通)
		cv2.LINE_AA(反锯齿线条)。
	shift:点的精度。这是一个整数值,表示每个坐标点 (x,y) 的偏移量。默认值为 0。
	offset:绘制多边形的偏移量。这是一个元组,表示在 x 和 y 方向上的偏移量。默认值为 (0,0)

获取到的掩码如下图

在这里插入图片描述
随后可以通过按位与运算对图像进行掩码操作

masked_image = cv2.bitwise_and(output, mask)

操作后的结果

在这里插入图片描述
我们将以上两个步骤写成一个函数

def mask_of_image(image):
    polygons = np.array([[(0, image.shape[0]), (0, 400), (image.shape[1]//2, 100), (image.shape[1], 400), (image.shape[1], image.shape[0])]])
    mask = np.zeros_like(image)
    cv2.fillPoly(mask, polygons, 255)
    masked_image = cv2.bitwise_and(image, mask)
    return masked_image

绘制到原图像

在这一步可以先获取车道线的直线部分,再将获取到的直线线段绘制到原图像

mask_img = mask_of_image(output)

img = cv2.imread('road.png')
lines = cv2.HoughLinesP(mask_img, 1, np.pi/180, 5)
for line in lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 4)

plt.imshow(img)

在这里插入图片描述

cv2.HoughLinesP 用于在二值图像中执行概率霍夫线变换(Probabilistic Hough Transform)以检测直线,能够返回检测到的直线的起点和终点的坐标。

以下是 cv2.HoughLinesP 的函数原型和参数说明:

语法
	cv2.HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)
参数:
	image:是通过边缘检测(如 Canny 边缘检测)处理后的图像。
	rho:参数 ρ 的步长(分辨率)。ρ 是从原点到直线的垂直距离(以像素为单位)。
	theta:参数 θ 的步长(分辨率)。θ 是直线的角度(以弧度为单位)。
		通常,可以使用较小的角度步长来提高角度的精度。
	threshold:累加器阈值。只有那些累加器值大于阈值的直线才会被返回。
		这个值越高,检测到的直线就越强。
	lines:一个可选参数,用于存储检测到的直线的端点坐标。
		它是一个 NumPy 数组,每行包含四个元素 [x1, y1, x2, y2],
		分别表示直线的起点和终点的坐标。
	minLineLength:可选参数,表示检测到的直线的最小长度。
		小于此长度的直线将被忽略。默认值为 None。
	maxLineGap:可选参数,表示在检测到的直线上被认为是同一部分的两个线段之间的最大距离。
		如果两个线段之间的间隔小于此值,则它们将被视为同一条直线。默认值为 None

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

双点重发布

一,实验要求 二,实验操作 loopback 0: 抓取流量并做策略,导入ospf1 [r1]ip ip-prefix aa permit 1.1.1.0 24 [r1]route-policy aa permit node 10 [r1-route-policy]if-match ip-prefix aa [r1-ospf-1]import-route direct rou…

进程创建-fork

demo1代码状态变迁 demo2代码输出到stdout使用管道 demo1 代码 #include <pthread.h> #include <iostream> #include <unistd.h> int main(int argc, char const *argv[]) {// 1.pid_t x fork();// 2.pid_t y fork();// 3.printf("%d %d\n", x…

PSFRGAN量化:量化技术、实现步骤与常见问题解决

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 背景PyTorch 量化量化流程动态量化训练后量化量化感知训练 Eager 模式量化训练后动态量…

分区恢复:恢复已删除/丢失的硬盘分区数据方法

通常情况下&#xff0c;如果分区正常&#xff0c;您可以直接在Windows资源管理器中看到并访问它。如果启动计算机时在Windows资源管理器中看不到某个分区&#xff0c;则该分区可能会丢失。将有一些解决方案可以帮助您修复和恢复已删除或丢失的硬盘驱动器分区&#xff0c;或从丢…

Spring Boot整合ElasticSearch实战 - 第511篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

Shell编程之函数

Shell函数 将命令序列按格式写在一起可方便重复使用命令序列Shell函数定义. 调用函数的方法 使用Shell函数的优点 使用函数可以避免代码重复使用函数可以将大的工程分割为若干小的功能模块&#xff0c;代码的可读性更强 Shell 函数定义 方式一&#xff1a; function 函数名…

Linux下Telemac-Mascaret源码编译安装及使用

目录 软件介绍 基本依赖 其它可选依赖 一、源码下载 二、解压缩 三、编译安装 3.1 修改环境变量设置文件 3.2 修改配置文件 3.3 编译安装 四、算例运行 软件介绍 TELEMAC-MASCARET是法国电力集团(EDF)的法国国立水利与环境实验室开发的一款研究水动力学和水文学领域的…

【C语言】指针(一)

目录 一、内存 1.1 ❥ 理解内存和地址的关系 1.2 ❥ 编址 二、指针变量 2.1 ❥ 取地址操作符&#xff08;&&#xff09; 2.2 ❥ 指针变量和解引用操作符&#xff08;*&#xff09; 2.3 ❥ 指针变量的大小 三、指针类型的意义 3.1 ❥ 指针的解引用 3.2 ❥ 指针-整数 3…

【MySQL探索之旅】JDBC (Java连接MySQL数据库)

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

供应商管理库存用什么软件

库存的管理是一个非常重要的话题&#xff0c;不管是企业还是个人&#xff0c;在日常工作中多多少少都会涉及到库存的管理&#xff0c;那么作为供应商&#xff0c;也是需要对库存进行管理的&#xff0c;因为需要对分销商进行出货&#xff0c;所以库存的有效管理非常重要。 供应商…

【数据结构】堆(Heap)

文章目录 一、堆的概念及结构二、堆的实现1.向上调整算法2.向下调整算法3.堆的创建4.堆的插入5.堆的删除6.堆的其他操作 三、堆的应用1.堆排序2.Top-K问题 一、堆的概念及结构 堆(Heap)是一种特殊的非线性结构。堆中的元素是按完全二叉树的顺序存储方式存储在数组 中。满足任意…

【送书福利第七期】你好!Java(文末送书)

文章目录 编辑推荐内容简介作者简介目录前言/序言 编辑推荐 适读人群 &#xff1a;程序员;相关院校师生 本书以轻松幽默的语言&#xff0c;从零开始介绍Java语言。书名来源于编程语言中最经典的Hello World程序&#xff0c;寓意带读者从入门到精通。 书中每章都设有总结与扩展…

开源软件托管平台gogs操作注意事项

文章目录 一、基本说明二、gogs私有化部署三、设置仓库git链接自动生成参数四、关闭新用户注册入口 私有化部署gogs托管平台&#xff0c;即把gogs安装在我们自己的电脑或者云服务器上。 一、基本说明 系统环境&#xff1a;ubuntu 20.4docker安装 二、gogs私有化部署 前期准…

深入学习心理学才知道以前高估了自己的交易能力

人的大脑总是能带来无限的惊喜。你能同时完成很多种工作而没有觉察你自己正在做这些事情。比如你一边开车一边打电话讨论着很严肃的事&#xff0c;边吃饭边用眼睛关心着后排坐着的孩子。除了这些外部的动作&#xff0c;你的内脏机能也在马不停蹄的工作着。这一切并不需要我们付…

【Shell】正则表达式的操作实例

正则表达式是一个描述一组字符串的模式 是由普通字符和元字符组成的字符集&#xff0c;而这个字符集匹配&#xff08;或指定&#xff09;一个模式。 正则表达式的操作实例 &#xff08;一&#xff09;概述1.定义2.作用3.类型 &#xff08;二&#xff09;字符串匹配实例&#xf…

掌握 Spring Boot 观察者模式:打造松耦合事件驱动应用程序

掌握 Spring Boot 观察者模式&#xff1a;打造松耦合事件驱动应用程序 观察者模式是一种常用的设计模式&#xff0c;用于解决事件驱动编程中的问题。该模式定义了一对多的依赖关系&#xff0c;其中一个对象&#xff08;主题&#xff09;向一组依赖它的对象&#xff08;观察者&a…

【phpstorm】根据等号对键值对进行自动对齐

对于强迫症的我&#xff0c;看到这样的代码&#xff0c;总想给它整理一番。 可以通过 ide 配置&#xff0c;手动格式化代码&#xff0c;整理成这样&#xff1a; ide 版本&#xff1a; PhpStorm 2023.1.3 配置路径&#xff1a; Setting -> Editor -> Code Style -> PH…

智能酒精壁炉与酒店前台的氛围搭配

智能酒精壁炉与酒店前台的氛围搭配可以为前台区域增添舒适、现代和独特的氛围&#xff0c;以下是一些建议&#xff1a; 欢迎区域装饰&#xff1a; 将智能酒精壁炉作为前台欢迎区域的装饰物&#xff0c;放置在客人抵达的显眼位置。选择现代设计的壁炉款式&#xff0c;如壁挂式…

SpringBoot整合SpringScurity权限控制(菜单权限,按钮权限)以及加上SSH实现安全传输

文章目录 项目地址&#xff1a; 一、md5 与 先进的哈希算法的区别1.1. 安全性问题1.2. 设计目的1.3. 功能特性1.4. 适用性1.5. 总结 二、数据传输安全和数据加密实现&#xff1a;2.1 生成证书&#xff1a;2.2、在springboot中进行集成2.2.1 配置证书&#xff1a;2.2.2. 强制使用…

Pytorch 与 Tensorflow:深度学习的主要区别(1)

引言 目前&#xff0c;Python 深度学习领域已经涌现出多个由科技界巨头如 Google、Facebook 和 Uber 等公司公开发布的框架&#xff0c;这些框架旨在帮助开发者构建先进的计算架构。对于刚接触这一领域的你来说&#xff0c;深度学习是计算机科学中的一个分支&#xff0c;它通过…