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

从零开始详解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

相关文章:

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

前言 车道线检测是智能驾驶和智能交通系统中的重要组成部分,对于提高道路安全、交通效率和驾驶舒适性具有重要意义。在本篇文章中将介绍使用OpenCV进行车道线的检测 详解 导入包 import cv2 import matplotlib.pyplot as plt import numpy as np读入图像并灰度化…...

【Java代码审计】逻辑漏洞篇

【Java代码审计】逻辑漏洞篇 逻辑漏洞概述常见逻辑漏洞点 逻辑漏洞概述 逻辑漏洞一般是由于源程序自身逻辑存在缺陷,导致攻击者可以对逻辑缺陷进行深层次的利用。逻辑漏洞出现较为频繁的地方一般是登录验证逻辑、验证码校验逻辑、密码找回逻辑、权限校验逻辑以及支…...

SSH简介

SSH,全名叫Secure Shell,你可以想象它是一个超级安全的管道,专门用来远程操控电脑的。就好比你在家用遥控器指挥远处的电视换台,但比这高级多了,因为它是专门为电脑设计的。 为什么需要SSH? 在互联网的早期…...

Oracle的高级分组函数grouping和grouping_id

在网上对Oracle的高级分组函数grouping和grouping_id的讲解并不多,特别是grouping_id,还有解说有误的。经过1天研究,已经完全掌握了两个函数的作用和用法,下面简单的讲述即可明白。下面给大家分享。 GROUPING 函数 语法:grouping(表达式) 作用: GROUPING将超聚…...

SqlServer 查询数据库 和 数据表 大小的语句

–Sqlserver 查询数据库 大小 SELECT * FROM (SELECT DB_NAME(database_id) AS DatabaseName,type_desc AS FileType,name AS FileName,size * 8 / 1024/1024 AS FileSizeGBFROM sys.master_filesWHERE type 0 -- 数据文件AND state 0 -- 在线状态 ) T1 ORDER BY FileSizeG…...

特殊类的设计与单例模式

1、特殊类的设计 如何设计出一个创建出的对象只能在堆上的类?将类的默认构造函数设置为私有,再将类的拷贝构造函数设置为delete,设置静态函数GetObj,内部调用new HeapOnly,这样就只能在堆上开辟空间。 class HeapOnly…...

MySQL从入门到高级 --- 6.函数

文章目录 第六章:6.函数6.1 聚合函数6.2 数学函数6.3 字符串函数6.4 日期函数6.4.1 日期格式 6.5 控制流函数6.5.1 if逻辑判断语句6.5.2 case when语句 6.6 窗口函数6.6.1 序号函数6.6.2 开窗聚合函数6.6.3 分布函数6.6.4 前后函数6.6.5 头尾函数6.6.6 其他函数6.7 …...

Qt---信号和槽

一、信号和槽机制 所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号…...

POCEXP编写—文件上传案例

POC&EXP编写—文件上传案例 1. 前言2. 文件上传案例2.1. Burp抓包2.2. 基础代码实践2.2.1. 优化代码 2.3. 整体代码2.3.1. 木马测试 1. 前言 之前的文章基本上都是一些相对来说都是验证类的或者说是一些代码执行类的,相对来说都不是太复杂,而这篇会…...

C#知识|上位机UI设计-详情窗体设计思路及流程(实例)

哈喽,你好啊,我是雷工! 上两节练习记录了登录窗体和主窗体的实现过程,本节继续练习内容窗体的实现,以下为练习笔记。 01 详情窗体效果展示: 02 添加窗体并设置属性 在之前练习项目的基础上添加一个Windows窗体,设置名称为:FrmIPManage.cs 设置窗体的边框和标题栏的外…...

目标检测——印度车辆数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …...

Zotero Word中插入带超链接的参考文献

Zotero 超链接 找了好多原代码,最接近能实施的为: https://blog.csdn.net/weixin_47244593/article/details/129072589 但是,就是向他说的一样会报错,我修改了代码,遇见报错的地方会直接跳过不执行,事后找…...

如何在服务器上下载,解压github上的代码

在github上找到对应仓库,找到平时download zip的地方,右键它,复制链接。在远程的终端里使用wget 链接 命令就可以得到zip了。 解压方法: -c :新建打包文件 -t :查看打包文件的内容含有哪些文件名 -x &…...

BGP学习二:BGP通告原则,BGP反射器,BGP路径属性细致讲解,新手小白无负担

目录 一.AS号 二.BGP路由生成 1.network 2.import-route引入 三.BGP通告原则 1.只发布最优且有效的路由 2.从EBGP获取的路由,会发布给所有对等体 3.水平分割原则 4.IBGP学习BGP默认不发送给EBGP,但如果也从IGP学习到了这条路由,就发…...

Docker学习(带图详细)

一、安装docker 参考官方文档:https://docs.docker.com/engine/install/centos/ 查看系统版本 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# [rootlocalhost ~]# uname -a Linux localhost.localdomai…...

RabbitMQ 如何使用延迟队列

RabbitMQ 如何使用延迟队列 目录 前置条件场景描述RabbitMQ 延迟队列机制实现步骤 1. 安装 RabbitMQ 延迟队列插件2. 创建延迟队列和交换机3. 发布延迟消息4. 消费延迟消息 示例代码 1. 延迟队列配置2. 发布消息的 Producer 代码3. 消费消息的 Consumer 代码 注意事项 前置条…...

【C++】栈和队列

目录 前言 一、stack 1. 栈的定义 2. 成员函数 二、queue 1. 队列的定义 2. 成员函数 三、priority_queue 1. 优先队列的定义 2. 成员函数 前言 栈和队列是STL中很重要的两个容器,栈的特点是先进后出;队列的特点是先进先出。还有优先队列&…...

常用的预编码算法学习

一、概况 预编码算法的常用实现方式有以下几种: 1. 间隔预编码(Interval Pre-coding):该算法将原始数据分成若干个间隔,然后对每个间隔内的数据进行编码。间隔的长度可以根据具体情况进行选择,常见的间隔长度有固定长度和可变长度两种方式。 2. 迭代预编码(Iterative…...

人才培养计划大纲

构建全面而高效的人才培养规划 文章大纲: 引言 人才培养的重要性当前人才培养面临的挑战文章目的与结构人才培养规划的基本概念 定义与内涵人才培养规划与企业战略的关系人才培养规划的基本原则人才培养规划的现状分析 当前人才培养规划的实践情况存在的问题与不足…...

多语言环境下的正则表达式实战:校验整数、小数

在软件开发中,正则表达式是验证用户输入数据格式的强大工具,特别是在处理表单验证时。本文将通过JavaScript、Java、Python、C、Rust、Go、C六种编程语言展示如何使用正则表达式来校验输入是否为整数或小数,特别强调小数点后最多保留两位的场…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...