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

news2024/11/27 1:17:25

前言

车道线检测是智能驾驶和智能交通系统中的重要组成部分,对于提高道路安全、交通效率和驾驶舒适性具有重要意义。在本篇文章中将介绍使用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.coloradmin.cn/o/1671274.html

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

相关文章

用matplotlib制作代码和色块

代码如下: # 声明 # -*- coding: utf-8 -*- """ Created on Mon May 13 11:18:59 2024author: sankang """ # 这里调用包 import matplotlib as mpl import matplotlib.pyplot as plt import numpy as npplt.rcParams[axes.unicode_…

ASP.NET仪器设备管理系统设计与实现

摘 要 文中以某中小型企业的设备管理为例,对设备管理系统的设计与应用进行研究,旨在通过设备管理系统提高内部设备的利用率及实现其最大的经济效益。文中首先对设备管理的现状及其重要性进行了分析,分析实现设备管理信息系统的必要性与可行…

1.基本概念,半导体基础

1.电压降: 指电流通过阻抗负载时的电位降的大小。(线段或部件两端的电压)。 2.数量较多的载流子称为多子 3.二极管和稳压管 4.习题

银发经济背后百万亿市场,解析冷门暴利的中老年AI赚钱项目!

最近“银发经济”这个词频繁出现,如果你注意到了抖音被封号的“秀才”以及仍在活跃的“一笑倾城”这两个账号,你就会明白中老年赛道的前景是多么广阔。 《银发经济蓝皮书》数据显示,到目前为止,我国60岁及以上的老年人口已超过2.8…

2024最佳项目管理软件整理

在项目管理领域,选择合适的任务管理软件对于提高团队效率和确保项目顺利进行至关重要。 以下是一些优秀的项目任务管理软件,以及它们的官网地址和特点介绍 序号软件名称官网地址特点介绍1zz-planhttps://zz-plan.com/一款在线甘特图协作软件&#xff0c…

炫酷渐变官网源码

炫酷渐变官网源码 效果图部分代码领取源码下期更新预报 效果图 部分代码 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><title…

下载驱动包提示 通常不会下载 未验证的下载

打开设置 添加允许站点 如果还是下载不了&#xff0c;那只能换资源了

基于网络的无人海洋船舶控制

书籍&#xff1a;Network-Based Control of Unmanned Marine Vehicles 作者&#xff1a;Yu-Long Wang&#xff0c;Qing-Long Han&#xff0c;Chen Peng&#xff0c;Lang Ma 出版&#xff1a;Springer 书籍下载-《基于网络的无人海洋船舶控制》控制系统中的通信网络可能引起延…

9.多数元素

文章目录 题目简介题目解答解法一&#xff1a;排序代码&#xff1a;复杂度分析&#xff1a; 解法二&#xff1a;摩尔投票法代码&#xff1a;复杂度分析&#xff1a; 解法三&#xff1a;哈希表代码复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来…

Meilisearch vs Elasticsearch

2个搜索引擎的比较&#xff08;官方说法&#xff09;&#xff1a;Meilisearch vs Elasticsearch Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需…

《intel开发手册卷3》读书笔记1

1、CPU工作模式 1&#xff09;实模式&#xff1a;8086的寄存器只有16位&#xff0c;我们也习惯于称8086的工作模式为16位模式。后续的CPU为了保持兼容性&#xff0c;在芯片上了电以后&#xff0c;还必须运行于16位模式之下。这种模式还有个正式的名字叫做实模式。在实模式下&am…

转移插槽笔记

4.3.4.转移插槽 我们要将num存储到7004节点&#xff0c;因此需要先看看num的插槽是多少&#xff1a; 如上图所示&#xff0c;num的插槽为2765. 我们可以将0~3000的插槽从7001转移到7004&#xff0c;命令格式如下&#xff1a; 具体命令如下&#xff1a; 建立连接&#xff1a;…

零一万物发布千亿参数模型Yi-Large,李开复呼吁关注TC-PMF,拒绝Ofo式烧钱打法

5月13日&#xff0c;在零一万物成立一周年之际&#xff0c;零一万物 CEO 李开复博士携带千亿参数 Yi-Large 闭源模型正式亮相&#xff0c;正式进军全球 SOTA 顶级大模型之首&#xff0c;在斯坦福最新的 AlpacaEval 2.0 达到全球大模型 Win Rate 第一。除此之外&#xff0c;零一…

你知道在 TS 中判断两个类型相等有多难吗?

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ TypeScript 中的类型相等 如果我们想判断两个变量是否相等&#xff0c;可以简单的通过 或 来进行比较&#xff0c;但是对比两个类型则不行。 在 TypeScript 中&#xff0c;类型是静态的&#xff0c;只会在编译时…

国标GB28181协议EasyGBS视频监控云平台端口正常却不能播放,是什么原因?

国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入&#xff0c;并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强&#xff0c;支持将接入的视频流进行全终端、全平台分发&#xff0c;分发的视频…

Deepin20.9使用系统工具升级到DeepinV23Bete3没有显卡驱动问题

心血来潮看到官网上有最新的桌面版就升级了 原来Deepin20.9使用系统工具升级到DeepinV23Bete3 升级后就出现错误了&#xff0c;没有分辨率设置&#xff0c;分辨率为800*600 查看硬件驱动&#xff0c;发现是没有显卡驱动 上命令直接安装&#xff1a; sudo apt-get install…

数据结构-栈的讲解

栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底&#xff08;因为先进后出&#xff09;。栈中的数据元素遵守后进先出LIFO&#xff08;Last In Firs…

【游戏引擎】unity

目录 Unity入门教程&#xff1a;从零到英雄的旅程前言第一步&#xff1a;下载和安装Unity第二步&#xff1a;创建你的第一个Unity项目第三步&#xff1a;熟悉Unity界面第四步&#xff1a;创建一个简单的游戏对象第五步&#xff1a;编写脚本赋予游戏对象生命第六步&#xff1a;运…

【一触即发】快来围观C3安全大会酷炫九宫格!

C3安全大会2024 2024年5月18日 南京扬子江国际会议中心 C3安全大会2024 即将揭幕&#xff01; 图解C3 | 九宫格 数智变革&#xff0c;“AI”正以其颠覆性力量&#xff0c;重塑我们对未来的定义。亚信安全邀您共襄盛举&#xff0c;见证这场于5月18日盛大开幕的C3安全大会2024…

办公软件_EdrawMax 免安装版教程 (亿图图示综合图形图表设计软件)

前言 万兴亿图图示(Wondershare EdrawMax)是一款综合图形图表设计软件,Visio国产替代.亿图图示中文版(Edraw Max)是一款办公绘图软件的思维导图软件.无需任何绘图功底,即可轻松创建各类思维导图.亿图图示专家,提供大量事例和在线模板,用于创建流程图,信息图,组织结构图,科学教…