竞赛 深度学习机器视觉车道线识别与检测 -自动驾驶

news2025/1/20 17:05:07

文章目录

  • 1 前言
  • 2 先上成果
  • 3 车道线
  • 4 问题抽象(建立模型)
  • 5 帧掩码(Frame Mask)
  • 6 车道检测的图像预处理
  • 7 图像阈值化
  • 8 霍夫线变换
  • 9 实现车道检测
    • 9.1 帧掩码创建
    • 9.2 图像预处理
      • 9.2.1 图像阈值化
      • 9.2.2 霍夫线变换
  • 最后

1 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 机器视觉 深度学习 车道线检测 - opencv

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

2 先上成果

请添加图片描述

3 车道线

理解车道检测的概念

那么什么是车道检测?以下是百度百科对车道的定义:

车道,又称行车线、车行道,是用在供车辆行经的道路。在一般公路和高速公路都有设置,高速公路对车道使用带有法律上的规则,例如行车道和超车道。

在这里插入图片描述

对其进行定义是很重要的,因为它使我们能够继续进行车道检测概念。我们在建立一个系统时不能有任何含糊不清的地方。

正如我前面提到的,车道检测是自动驾驶汽车和自动驾驶汽车的关键组成部分。这是驾驶场景理解的重要研究课题之一。一旦获得车道位置,车辆就知道去哪里,并避免撞上其他车道或离开道路。这样可以防止驾驶员/车辆系统偏离车道。

以下是一些随机道路图像(第一行)及其检测到的车道(第二行):

4 问题抽象(建立模型)

我们希望执行的任务是实时检测视频中的车道。我们可以通过多种方式进行车道检测。我们可以使用基于学习的方法,例如在带注释的视频数据集上训练深度学习模型,或者使用预训练好的模型。

然而,也有更简单的方法来执行车道检测。在这里,学长将向你展示如何在不使用任何深入学习模型的情况下完成此任务。

下面是将要处理的视频的一个帧:

正如我们在这张图片中看到的,我们有四条车道被白色的车道标线隔开。所以,要检测车道,我们必须检测车道两边的白色标记。这就引出了一个关键问题——我们如何检测车道标线?

除了车道标线之外,场景中还有许多其他对象。道路上有车辆、路侧护栏、路灯等,在视频中,每一帧都会有场景变化。这很好地反映了真实的驾驶情况。

因此,在解决车道检测问题之前,我们必须找到一种方法来忽略驾驶场景中不需要的对象。

我们现在能做的一件事就是缩小感兴趣的领域。与其使用整个帧,不如只使用帧的一部分。在下面的图像中,除了车道的标记之外,其他所有内容都隐藏了。当车辆移动时,车道标线将或多或少地落在该区域内:

在这里插入图片描述

5 帧掩码(Frame Mask)

帧掩码只是一个NumPy数组。

当我们想对图像应用掩码时,只需将图像中所需区域的像素值更改为0、255或任何其他数字。

下面给出了一个图像掩蔽的例子。图像中某个区域的像素值已设置为0:

在这里插入图片描述
这是一种非常简单但有效的从图像中去除不需要的区域和对象的方法。

6 车道检测的图像预处理

我们将首先对输入视频中的所有帧应用掩码。

然后,我们将应用图像阈值化和霍夫线变换来检测车道标线。

7 图像阈值化

在这种方法中,灰度图像的像素值根据阈值被指定为表示黑白颜色的两个值之一。因此,如果一个像素的值大于一个阈值,它被赋予一个值,否则它被赋予另一个值。

在这里插入图片描述

如上所示,对蒙版图像应用阈值后,我们只得到输出图像中的车道标线。现在我们可以通过霍夫线变换很容易地检测出这些标记。

8 霍夫线变换

霍夫线变换是一种检测任何可以用数学方法表示的形状的方法。

例如,它可以检测矩形、圆、三角形或直线等形状。我们感兴趣的是检测可以表示为直线的车道标线。

在执行图像阈值化后对图像应用霍夫线变换将提供以下输出:

在这里插入图片描述

9 实现车道检测

是时候用Python实现这个车道检测项目了!我推荐使用Google Colab,因为构建车道检测系统需要计算能力。

首先导入所需的库:

import os
import re
import cv2
import numpy as np
from tqdm import tqdm_notebook
import matplotlib.pyplot as plt
# 获取帧的文件名
col_frames = os.listdir('frames/')
col_frames.sort(key=lambda f: int(re.sub('\D', '', f)))

# 加载帧
col_images=[]
for i in tqdm_notebook(col_frames):
    img = cv2.imread('frames/'+i)
    col_images.append(img)
# 指定一个索引
idx = 457

# plot frame
plt.figure(figsize=(10,10))
plt.imshow(col_images[idx][:,:,0], cmap= "gray")
plt.show()

在这里插入图片描述

9.1 帧掩码创建

我们感兴趣的区域是一个多边形。我们想掩盖除了这个区域以外的一切。因此,我们首先必须指定多边形的坐标,然后使用它来准备帧掩码:

在这里插入图片描述
在这里插入图片描述

9.2 图像预处理

我们必须对视频帧执行一些图像预处理操作来检测所需的车道。预处理操作包括:

  • 图像阈值化

  • 霍夫线变换

9.2.1 图像阈值化

在这里插入图片描述

9.2.2 霍夫线变换

lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)

# 创建原始帧的副本
dmy = col_images[idx][:,:,0].copy()

# 霍夫线
for line in lines:
  x1, y1, x2, y2 = line[0]
  cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)

# 画出帧
plt.figure(figsize=(10,10))
plt.imshow(dmy, cmap= "gray")
plt.show()

在这里插入图片描述

最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相关文章

Flutter 组件集录 | InheritedNotifier 内置状态管理组件

theme: cyanosis 1. 前言 在上一篇 《Flutter 知识集锦 | 监听与通知 ChangeNotifier》 中,我们介绍了 ChangeNotifier 对象通知监听者的能力。并通过一个简单的模拟下载进度案例,介绍了它的使用方式: | 案例演示 | 监听-通知关系 | | --- | …

DBeaver 23.2.3发布,带来多项增强和修复

数据库管理工具DBeaver最新版本23.2.3已经发布。这个版本带来了一系列的增强和修复,提升了用户的使用体验和工作效率。 以下是DBeaver 23.2.3版本的一些亮点功能: 数据编辑器方面的改进: Excel (XLSX) 导出现在支持列自动拟合,…

人大金仓迁移报错ERROR: invalid byte sequence for encoding “UTF8“: 0x00

Oracle迁移人大金仓,报错: com.kingbase8.utilKSOLException: ERROR: invalid byte sequence for encoding “UTF8”: 0x00 报错信息,如图所示: 解决方案 1、设置参数,在kingbase.conf 最后面添加参数:ign…

串口通信(8)串口中断“边接收边解析数据“的通信程序

本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步! > 发布人:日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

linux笔记总结-基本命令

参考: 1.Linux 和Windows比 比较 (了解) 1. 记住一句经典的话:在 Linux 世界里,一切皆文件 2. Linux目录结构 /lib • 系统开机所需要最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几 乎所有…

流媒体服务实现H5实时预览视频

目录 背景方案业务实践细节注意 待办 背景 客户aws服务磁盘存储告急,最高可扩容16T。排查如下:主要是视频文件存在大量复制使用的情况。例如发布节目时复制、预览时复制,这样上传一份视频后最大会有四份拷贝(预览、普通发布、互动…

PHP隐藏手机号码、银行卡号、真实姓名部分方法

1、隐藏手机号码,隐藏手机号中间部分 /*** 隐藏手机号码* param int $mobile 手机号码* param int $head 头部显示数* param int $tail 尾部显示数* param string $hide_str 隐藏字符串* return string*/ function getHiddenMobile($mobile, $head 3, $tail 4, $hide_str *…

PHP依赖注入 与 控制反转详解

依赖注入 是一种设计模式,用于解耦组件之间的依赖关系。 它的主要思想是通过将依赖的对象传递给调用方,而不是由调用方自己创建或管理依赖的对象。这种方式使得组件的依赖关系更加灵活,易于维护和测试。 控制反转 是一个更广泛的概念&#…

C++ 输入输出流

iostream库,包含两个基础类型istream(输入流)和ostream(输出流)。一个流就是一个字符序列。 流 输入输出产生的字符串称为流。 被称为流的原因:所有的字符都在缓冲区中,从缓冲区拿/放都是顺序进行的,字符串的消耗,像…

IDEA 设置代码注释模板

功能简介: 每次看别人代码时,面对毫无注释的类,除了头大还是头大, 以下提供了一种代码类注释模板 新建java类的时候,自动增加类注释,养成代码开发好习惯 效果展示: 代码模板: #if (…

《算法通关村—如何使用中序和后序来恢复一颗二叉树》

《算法通关村—如何使用中序和后序来恢复一颗二叉树》 中序:3 4 8 6 7 5 2 1 10 9 11 15 13 14 12 后序:8 7 6 5 4 3 2 10 15 14 13 12 11 9 1 通过后续遍历我们知道根节点是1,通过知道根节点是1,我们就可以从中序序列知道那些 …

不只保护隐私的防窥膜,还是屏幕的小铠甲

电脑防窥膜这种东西确实很实用,尤其是那些经常在公共场所用笔记本的朋友,更是需要这张贴膜的保护,不过虽然现在市面上这种防窥膜种类繁多,但是产品质量良莠不齐。有些防窥膜虽然有防窥效果,但透光率下降太多了&#xf…

【使用Python编写游戏辅助工具】第一篇:概述

引言 欢迎阅读本系列文章,本系列将带领读者朋友们使用Python来实现一个简单而有趣的游戏辅助工具。 写这个系列的缘由源自笔者玩了一款游戏。正巧,笔者对Python编程算是有一定的熟悉,且Python语言具备实现各种有趣功能的能力,因…

如何解决MySQL主从复制延时问题

MySQL 主从延时的原因是什么? 具体哪个环节发生延时? 如何解决呢? 对于这“三连问”,极少有同学能通关,甚至有同学连主从复制原理都不清楚。 01 什么是主从延时? 有时候我们遇到从数据库中获取不到信息…

Centos8安装yum源时候出现的异常问题及解决方案(保好使)

问题的出现 作者在使用centos8的时候,想安装tree命令,输入了如下的命令: yum install tree 但是却显示了下面的错误: Errors during downloading metadata for repository base: - Curl error (28): Timeout was reached for h…

MySQL第一讲·存储与字段

你好,我是安然无虞。 文章目录 1. 存储:一个完整的存储过程是怎样的?创建MySQL数据库确认字段创建数据表插入数据 2. 字段:那么多字段类型,该怎么定义?整数类型浮点数类型和定点数类型文本类型日期与时间类…

Shiny Server和ShinyProxy是什么,有什么区别?

调研以及参与过多个生物公司的生信工具研发,不管是ShinyServer还是ShinyProxy都有一定研究,尤其是ShinyServer。如果仅是本地化测试想快速的搭建Shiny应用,我推荐用Shiny Server,如果多并发用户且更好的线上管理Shiny应用&#xf…

【Unity数据交互】Json序列化你记得几分

ˊˊ 👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏&#xff1…

掌握这几个技巧,才敢称为Jenkins大神!

01、Performance插件兼容性问题 自由风格项目中,有使用 Performance 插件收集构建产物,但是截至到目前最新版本(Jenkins v2.298,Performance:v3.19),此插件和Jenkins都存在有兼容性问题&#x…

scanpy赋值问题

今天发现一个很奇怪的bug import numpy as np import pandas as pd import anndata as ad from scipy.sparse import csr_matrix print(ad.__version__)counts csr_matrix(np.random.poisson(1, size(100, 2000)), dtypenp.float32) adata1 ad.AnnData(counts) print(adata1)…