基于OpenCV的视频道路车道检测

2023-11-09

前言

本篇博客转载于博主@Ginomica

综述

据统计近年来将近一半的交通事故与车辆行驶偏离正常车道有关。驾驶员注意力不集中或者疲劳驾驶,导致车辆无意识的偏离是交通事故的主要原因,由此汽车驾驶过程中车道偏离的自动检测也成为业界研究热点。

基于以上的实际需要,本设计完成了一种基于视频道路的车道检测方法,用于对车道的信息进行检测。主要研究内容如下:

  1. 利用颜色空间变换、Sobel算子创建阈值化二值图像,检测出的目标线可能是车道线的一部分;
  2. 应用透视变换校正二值图像,获得车道的鸟瞰图,裁剪原始图像中最有可能具有车道线像素的区域;
  3. 基于二次多项式对车道线进行拟合,确定车道边界;
  4. 确定车道曲率和车辆相对于中心的位置,使用从透视变换计算出的逆矩阵对原始图像进行覆盖;
  5. 向原始图像添加文本以显示车道线的曲率半径和车辆偏移距离。

运行方法

python line_fit_video.py

下面是项目文件的功能说明,项目文件已经上传至GitHub与码云。
https://gitee.com/Ginomica/lane_detection

Input_Video.mp4 - 输入视频
Output_Video.mp4 - 输出视频
combined_thresh.py - 路面图像二值化实现
perspective_transform.py - 透视变换实现
line_fit.py - 基于二次多项式拟合车道线及曲率半径、车辆偏移距离实现
line_fit_video.py - 主文件

车道检测的实现

路面图像二值化

创建一个阈值化的二值图像,将未失真的图像作为输入。目标是识别可能是车道线一部分的像素。特别是执行以下操作:

  1. 应用以下带阈值的过滤器,以创建对应于每个单独过滤器的独立二进制图像: 图像上的绝对水平Sobel算子; Sobel算子在水平和垂直方向,并计算其大小; Sobel算子计算梯度的方向;
  2. 把图像从RGB空间转换到HLS空间,阈值化S通道;
  3. 将上述二进制图像合并,创建最终的二进制图像。

下图所示便是利用多个过滤器的Sobel算子来对图像进行二值化处理的最终结果。 路面图像二值化 图一表示绝对水平Sobel算子过滤器相对应的二值图像 图二表示水平方向和垂直方向的Sobel算子过滤器相对应的二值图像 图三表示梯度方向的Sobel算子过滤器相对应的二值图像 图四表示HLS空间且对S通道设置阈值的过滤器相对应的二值图像 图五表示原图像 图六表示结合以上的二值图像创建的最终的二值图像
在这里插入图片描述

基于透视变换提取车道区域

给定阈值的二值图像,下一步是执行透视变换。目标是转换图像,使我们获得车道的鸟瞰图,这使我们能够将曲线拟合到车道线【例如多项式拟合】。同时裁剪原始图像中最有可能有车道线像素的区域。

为了完成透视变换,使用OpenCV的getPerspectiveTransform()和warpPerspective()函数。同时对透视变换的源点和目标点进行了硬编码。源点和目的点通过人工检查直观地确定。

下图所示便是透视变换后的图像与透视空间逆变换后的图像。 基于透视变换提取车道区域 基于透视变换提取车道区域
在这里插入图片描述
在这里插入图片描述

基于二次多项式拟合车道线

给定上一步变换后的二进制图像,现在为左右车道线拟合一个二阶多项式。

计算图像下半部分的直方图,将图像分成9个水平切片,从底部开始,在直方图的左峰和右峰周围围起一个200像素宽的窗口【将直方图垂直拆分为两半】,在水平窗口切片上查找可能是左车道和右车道一部分的像素,像素最多的位置作为车道线的起始位置,然后自定义窗口大小和个数向上做滑窗操作,滑动窗口自下往上计算在滑动窗口中的投影值, 取投影值最大的列和滑动窗口底边所在的行作为透视空间中的车道线坐标点,求出每个窗口中像素点的x和y坐标作为车道线的x,y坐标,当前窗口像素的平均x坐标作为下一个滑窗的中心位置。给定左车道线和右车道线候选像素,利用滑动窗口和车道线的坐标用cv2.fitpoly()函数拟合二阶多项式,表示估计的左车道线和右车道线。

滑窗的方法通常用于第一帧或者检测失败重新开始的检测方式,对计算资源浪费过多,检测时间长。由于连续帧图像之间相差不大,之后几帧的图像可以只对第一帧拟合的曲线周围检测,设置周围的margin,然后在该范围内寻找下一帧曲线的像素点从而拟合曲线。在最后处理每一帧图像时要设置标志位检测是否检测到拟合的曲线,检测到的话用tune_fit()方法,否则的话要用滑窗的方法重新寻找车道线。

由于我们的目标是从视频流中找到车道线,所以我们可以利用视频帧之间的时间相关性。给定从先前视频帧计算的多项式拟合,实现的方法是从先前预测的车道线水平搜索+ / -100像素。然后我们只需对快速搜索中找到的像素执行二阶多项式拟合。如果我们找不到足够的像素,我们可以返回一个错误【例如return None】,并且函数的调用方将忽略当前帧(即保持车道线不变),并确保在下一帧上执行完全搜索。总的来说,这将提高车道检测的速度。利用时间相关性的另一个好处是平滑多项式拟合参数,这样做的好处是使检测器对噪声输入更为鲁棒。对于最近的5个视频帧,使用了多项式系数的简单移动。

下图所示便是利用滑动窗口检测车道线的位置与二次多项式拟合后的左右车道线。
在这里插入图片描述

基于二次多项式拟合车道线

计算曲率半径与车辆的偏移距离

给出了左车道线和右车道线的多项式拟合,根据这里给出的公式计算每条线的曲率半径。将距离单位从像素转换为米,假设垂直方向每720像素30米,水平方向每700像素3.7米。最后平均左右车道线的曲率半径,并在最后的视频标注曲率半径值。

从给定的左车道线和右车道线拟合的多项式中计算出车辆的偏移量。车辆中心的偏移量在最后进行了注释。在把像素转换成米时利用同样的假设。为了计算车辆与车道线中心的偏移量,假设车辆的中心是图像的中心,计算左车道线底部x值和右车道线底部x值的平均值作为车道的中心。偏移量就是车辆的中心x值【即图像的中心x值】减去车道的中心x值。

用车道区域标注原始图像

给定以上所有内容,我们可以用车道面积以及关于车道曲率和车辆偏移的信息来注释原始图像。

  1. 创建一个空白图像,并绘制我们的拟合线【估计左右车道线】;
  2. 填充线条之间的区域【绿色】;
  3. 使用从透视变换计算的逆变换矩阵来取消上面的透视变换效果,使其与原始图像的透视对齐;
  4. 在原始图像上覆盖上述信息;
  5. 向原始图像添加文本以显示车道曲率和车辆偏移。
    用车道区域标注原始图像
    在这里插入图片描述

总结

本设计基于OpenCV实现了对视频道路的车道检测。基于HLS颜色空间和 Sobel边缘提取方法设置一定的阈值范围来对图像其进行有效分割,检测车道线的大概位置,接着基于透视变换在透视变换空间中提取车道线的坐标点,并用二次多项式拟合车道线,从给定的左车道线和右车道线拟合的多项式中计算出左右车道线的曲率半径、车辆的偏移量,并在原始图像上面对这些信息进行标注,有效地实现了对于车道的检测,鲁棒性较好。但是仍然存在着不足之处:当在有裂缝的道路上进行检测时,裂缝可能被误认为是车道线导致检测失误;前面的其他车辆也有可能诱使车道检测认为它是车道的一部分,导致检测失败。为了使车道检测系统鲁棒性更佳,我们可以结合深度学习中语义分割的方法对以上的问题进行解决,语义分割是在像素级别上的分类,属于同一类的像素都要被归为一类,因此语义分割是从像素级别来理解图像的,例如基于深度学习的语义分割来查找可能是车道的像素。

文章转载于:https://gitee.com/Ginomica/lane_detection

Authors
duxiaobai
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于OpenCV的视频道路车道检测 的相关文章

  • 使用 python 进行串行数据记录

    Intro 我需要编写一个小程序来实时读取串行数据并将其写入文本文件 我在读取数据方面取得了一些进展 但尚未成功地将这些信息存储在新文件中 这是我的代码 from future import print function import se
  • python 中的代表

    我实现了这个简短的示例来尝试演示一个简单的委托模式 我的问题是 这看起来我已经理解了委托吗 class Handler def init self parent None self parent parent def Handle self
  • 如何在 pytest 中将单元测试和集成测试分开

    根据维基百科 https en wikipedia org wiki Unit testing Description和各种articles https techbeacon com devops 6 best practices inte
  • 为什么Python的curses中escape键有延迟?

    In the Python curses module I have observed that there is a roughly 1 second delay between pressing the esc key and getc
  • 使用 OLS 回归预测未来值(Python、StatsModels、Pandas)

    我目前正在尝试在 Python 中实现 MLR 但不确定如何将我找到的系数应用于未来值 import pandas as pd import statsmodels formula api as sm import statsmodels
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • 如何解决使用 Spark 从 S3 重新分区大量数据时从内存中逐出缓存的表分区元数据的问题?

    在尝试从 S3 重新分区数据帧时 我收到一个一般错误 Caused by org apache spark SparkException Job aborted due to stage failure Task 33 in stage 1
  • 如何从Python中的字符串中提取变量名称和值

    我有一根绳子 data var1 id 12345 name John White python中有没有办法将var1提取为python变量 更具体地说 我对字典变量感兴趣 这样我就可以获得变量的值 id和name python 这是由提供
  • 如何设置 Celery 来调用自定义工作器初始化?

    我对 Celery 很陌生 我一直在尝试设置一个具有 2 个独立队列的项目 一个用于计算 另一个用于执行 到目前为止 一切都很好 我的问题是执行队列中的工作人员需要实例化一个具有唯一 object id 的类 每个工作人员一个 id 我想知
  • 按元组分隔符拆分列表

    我有清单 print L I WW am XX newbie YY ZZ You WW are XX cool YY ZZ 我想用分隔符将列表拆分为子列表 ZZ print new L I WW am XX newbie YY ZZ You
  • Seaborn Pairplot 图例不显示颜色

    我一直在学习如何在Python中使用seaborn和pairplot 这里的一切似乎都工作正常 但由于某种原因 图例不会显示相关的颜色 我无法找到解决方案 因此如果有人有任何建议 请告诉我 x sns pairplot stats2 hue
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • 在 Pandas 中使用正则表达式的多种模式

    我是Python编程的初学者 我正在探索正则表达式 我正在尝试从 描述 列中提取一个单词 数据库名称 我无法给出多个正则表达式模式 请参阅下面的描述和代码 描述 Summary AD1 Low free DATA space in data
  • 使用 Firefox 绕过弹出窗口下载文件:Selenium Python

    我正在使用 selenium 和 python 来从中下载某些文件web page http www oceanenergyireland com testfacility corkharbour observations 我之前一直使用设
  • 默认情况下,Keras 自定义层参数是不可训练的吗?

    我在 Keras 中构建了一个简单的自定义层 并惊讶地发现参数默认情况下未设置为可训练 我可以通过显式设置可训练属性来使其工作 我无法通过查看文档或代码来解释为什么会这样 这是应该的样子还是我做错了什么导致默认情况下参数不可训练 代码 im
  • 使用 PyTorch 分布式 NCCL 连接失败

    我正在尝试使用 torch distributed 将 PyTorch 张量从一台机器发送到另一台机器 dist init process group 函数正常工作 但是 dist broadcast 函数中出现连接失败 这是我在节点 0
  • 当鼠标悬停在上面时,intellisense vscode 不显示参数或文档

    我正在尝试将整个工作流程从 Eclipse 和 Jupyter Notebook 迁移到 VS Code 我安装了 python 扩展 它应该带有 Intellisense 但它只是部分更糟糕 我在输入句点后收到建议 但当将鼠标悬停在其上方
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • 列表值的意外更改

    这是我的课 class variable object def init self name name alias parents values table name of the variable self name 这是有问题的函数 f

随机推荐

  • linux的自旋锁struct spinlock_t的使用

    在linux中提供了一些机制用来避免竞争条件 最简单的一个种就是自旋锁 例如 当一个临界区的数据在多个函数之间被调用时 为了保护数据不被破坏 可以采用spinlock来保护临界区的数据 当然还有一个就是信号量也是可以实现临界区数据的保护的
  • 直接把软件界面做成游戏界面。CEGUI 专用游戏界面开发库。

    下载 http www cegui org uk wiki index php Downloads 更多中文教程 http www ispinel com 2010 05 26 971 首先感谢李素颙同学的热心和耐心指导 做游戏或者计算机图
  • 对应用数据开发还有疑惑?看这篇就够了!数据存储、管理,通通掌握!

    原文 对应用数据开发还有疑惑 看这篇就够了 数据存储 管理 通通掌握 点击链接查看更多技术内容 数据管理可以做什么 应用数据的持久化怎么实现 如何实现数据库加密 在开发应用进行应用数据的处理时 您是否也会有这些疑问呢 现在 我们推出了更为清
  • Access Token(访问令牌)学习

    Access Token 访问令牌 是一种用于身份验证和授权的令牌 在软件开发中 访问令牌通常用于访问受限资源或执行特定操作 Access Token 通常由身份验证服务器颁发 以授权客户端应用程序代表用户访问受保护的资源 当用户进行身份验
  • opencv笔记之--图片模糊操作和锐化操作

    一 模糊操作 usr bin env python coding utf 8 import cv2 as cv import numpy as np def blur demo image dst cv blur image 15 1 cv
  • go换源

    Windows 版本 SETX GO111MODULE on go env w GOPROXY https goproxy cn direct SETX GOPROXY https goproxy cn direct Linux 版本 ec
  • 部署Zabbix企业级分布式监控

    1 定义 1 1 监控定义 通过一个友好的界面进行浏览整个网站所有的服务器状态 可以在Web前端方便的查看监控数据 可以回溯寻找事故发生时系统的问题和报警情况 分类 传统 zabbix nagois 云原生 prometheus 1 2 z
  • 基于tcpdump实例讲解TCP/IP协议

    前言 虽然网络编程的socket大家很多都会操作 但是很多还是不熟悉socket编程中 底层TCP IP协议的交互过程 本文会一个简单的客户端程序和服务端程序的交互过程 使用tcpdump抓包 实例讲解客户端和服务端的TCP IP交互细节
  • 【深度】谭铁牛院士谈人工智能发展新动态

    来源 Frontiers 11月25日 模式识别与人工智能学科前沿研讨会在自动化所召开 会上 谭铁牛院士做 人工智能新动态 报告 回顾了近代以来历次科技革命及其广泛影响 并根据科学技术发展的客观规律解释了当前人工智能备受关注的深层原因 报告
  • Git工作流程:如何在团队中协作?

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 前端炫酷代码分享 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架构咱们从0说 数据流通的精妙之道 文章目录 前言 G
  • 《Happy Birthday》游戏开发记录(送给朋友的小礼物)

    游戏开发的学习记录 项目 Happy Birthday 一个小小小游戏 基于unity给朋友做的一个生日小礼物 之前都是礼物加信 今年想用自己的技能 把信的内容以另一种方式送给她 但在做这个的时候 也学到一些新的东西 所以把这个也记录下来了
  • ieee-explore/springer文献免费下载办法

    http ieeexplore ieee org document xxxxxxx 改为 http ieeexplore ieee org sci hub tw document xxxxxxx 即可免费下载 是哈萨克斯坦女黑客搞的 见下文
  • 一文带你看懂 MySQL 存储引擎

    本文目录 1 MySQL体系结构 2 存储引擎介绍 3 MySQL 存储引擎特性 4 MySQL 有哪些存储引擎 5 了解 MySQL 数据存储方式 6 MySQL存储引擎介绍 6 1 CSV存储引擎 6 1 1 CSV介绍 6 1 2 使
  • c++中的list容器讲解

    文章目录 1 list的介绍及使用 1 1 list的介绍 1 2 list的使用 1 2 1 list的构造 1 2 2 list iterator的使用 1 2 3 list capacity 1 2 4 list element ac
  • vscode python3安装 xlwt_python EXCEL自动化办公(一)xlrd、xlwt、xlsxwriter安装过程

    目前在python中实现EXCEL办公自动化过程中 经常用到两个包 xlrd和xlwt 在某些博主或者资料中指出xlwt有bug 目前不清楚是否被修复 我们这里保险起见 再安装另一个包xlsxwriter 其中xlrd作为excel读取 x
  • IDEA访问不了官网?看过来!(超详!超细!)

    IDEA访问不了官网 显示 无法访问此网址 超详细 导语 IDEA访问不了 话不多说 实战为主 作者 变优秀的小白 Github YX XiaoBai 爱好 Americano More Ice QQ交流群 new 811792998 注
  • 算法学习 day23

    669 修剪二叉搜索树 给你二叉搜索树的根节点 root 同时给定最小边界low 和最大边界 high 通过修剪二叉搜索树 使得所有节点的值在 low high 中 修剪树 不应该 改变保留在树中的元素的相对结构 即 如果没有被移除 原有的
  • 什么是包?导包的机制

    目录 小白眼中的包 Java包的定义 小白眼中的包 书包 钱包 水桶包都是包 根据盛放东西的区别而划分了不同的种类 盛书的叫书包 盛钱的叫钱包 盛日常出行必备品的桶装包叫水桶包 由此推导 包是盛纳物品的容器 Java包的定义 Java包指的
  • idea中配置连接多个数据库

    要在一个项目中连接如下两个数据库 yml中配置两个不同数据库 master datasource username root password url jdbc mysql localhost 3306 study useUnicode t
  • 基于OpenCV的视频道路车道检测

    基于OpenCV的视频道路车道检测 前言 综述 运行方法 车道检测的实现 路面图像二值化 基于透视变换提取车道区域 基于二次多项式拟合车道线 基于二次多项式拟合车道线 计算曲率半径与车辆的偏移距离 用车道区域标注原始图像 总结 前言 本篇博