竞赛选题 深度学习 机器视觉 车位识别车道线检测 - python opencv

news2025/3/12 17:34:08

0 前言

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

🚩 深度学习 机器视觉 车位识别车道线检测

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

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

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

🧿 更多资料, 项目分享:

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

简介

你是不是经常在停车场周围转来转去寻找停车位。如果你的车辆能准确地告诉你最近的停车位在哪里,那是不是很爽?事实证明,基于深度学习和OpenCV解决这个问题相对容易,只需获取停车场的实时视频即可。

检测效果

废话不多说, 先上效果图
在这里插入图片描述
在这里插入图片描述
注意车辆移动后空车位被标记上
在这里插入图片描述
在这里插入图片描述

车辆移动到其他车位

在这里插入图片描述

实现方式
整体思路

这个流程的第一步就是检测一帧视频中所有可能的停车位。显然,在我们能够检测哪个是没有被占用的停车位之前,我们需要知道图像中的哪些部分是停车位。

第二步就是检测每帧视频中的所有车辆。这样我们可以逐帧跟踪每辆车的运动。

第三步就是确定哪些车位目前是被占用的,哪些没有。这需要结合前两步的结果。

最后一步就是出现新车位时通知我。这需要基于视频中两帧之间车辆位置的变化。

这里的每一步,我们都可以使用多种技术用很多种方式实现。构建这个流程并没有唯一正确或者错误的方式,但不同的方法会有优劣之分。

使用要使用到两个视觉识别技术 :识别空车位停车线,识别车辆
检测空车位

车位探测系统的第一步是识别停车位。有一些技巧可以做到这一点。例如,通过在一个地点定位停车线来识别停车位。这可以使用OpenCV提供的边缘检测器来完成。但是如果没有停车线呢?

我们可以使用的另一种方法是假设长时间不移动的汽车停在停车位上。换句话说,有效的停车位就是那些停着不动的车的地方。但是,这似乎也不可靠。它可能会导致假阳性和真阴性。

那么,当自动化系统看起来不可靠时,我们应该怎么做呢?我们可以手动操作。与基于空间的方法需要对每个不同的停车位进行标签和训练不同,我们只需标记一次停车场边界和周围道路区域即可为新的停车位配置我们的系统。

在这里,我们将从停车位的视频流中截取一帧,并标记停车区域。Python库matplotlib
提供了称为PolygonSelector的功能。它提供了选择多边形区域的功能。

我制作了一个简单的python脚本来标记输入视频的初始帧之一上的多边形区域。它以视频路径作为参数,并将选定多边形区域的坐标保存在pickle文件中作为输出。

在这里插入图片描述

import os
import numpy as np
import cv2
import pickle
import argparse
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.widgets import PolygonSelector
from matplotlib.collections import PatchCollection
from shapely.geometry import box
from shapely.geometry import Polygon as shapely_poly

points = []
prev_points = []
patches = []
total_points = []
breaker = False

class SelectFromCollection(object):
 def __init__(self, ax):
 self.canvas = ax.figure.canvas
 self.poly = PolygonSelector(ax, self.onselect)
 self.ind = []

 def onselect(self, verts):
 global points
 points = verts
 self.canvas.draw_idle()

 def disconnect(self):
 self.poly.disconnect_events()
 self.canvas.draw_idle()

def break_loop(event):
 global breaker
 global globSelect
 global savePath
 if event.key == 'b':
 globSelect.disconnect()
 if os.path.exists(savePath):
 os.remove(savePath)

 print("data saved in "+ savePath + " file") 
 with open(savePath, 'wb') as f:
 pickle.dump(total_points, f, protocol=pickle.HIGHEST_PROTOCOL)
 exit()

def onkeypress(event):
 global points, prev_points, total_points
 if event.key == 'n': 
 pts = np.array(points, dtype=np.int32) 
 if points != prev_points and len(set(points)) == 4:
 print("Points : "+str(pts))
 patches.append(Polygon(pts))
 total_points.append(pts)
 prev_points = points

if __name__ == '__main__':
 parser = argparse.ArgumentParser()
 parser.add_argument('video_path', help="Path of video file")
 parser.add_argument('--out_file', help="Name of the output file", default="regions.p")
 args = parser.parse_args()

 global globSelect
 global savePath
 savePath = args.out_file if args.out_file.endswith(".p") else args.out_file+".p"

 print("\n> Select a region in the figure by enclosing them within a quadrilateral.")
 print("> Press the 'f' key to go full screen.")
 print("> Press the 'esc' key to discard current quadrilateral.")
 print("> Try holding the 'shift' key to move all of the vertices.")
 print("> Try holding the 'ctrl' key to move a single vertex.")
 print("> After marking a quadrilateral press 'n' to save current quadrilateral and then press 'q' to start marking a new quadrilateral")
 print("> When you are done press 'b' to Exit the program\n")
 
 video_capture = cv2.VideoCapture(args.video_path)
 cnt=0
 rgb_image = None
 while video_capture.isOpened():
 success, frame = video_capture.read()
 if not success:
 break
 if cnt == 5:
 rgb_image = frame[:, :, ::-1]
 cnt += 1
 video_capture.release()
 
 while True:
 fig, ax = plt.subplots()
 image = rgb_image
 ax.imshow(image)
 
 p = PatchCollection(patches, alpha=0.7)
 p.set_array(10*np.ones(len(patches)))
 ax.add_collection(p)
 
 globSelect = SelectFromCollection(ax)
 bbox = plt.connect('key_press_event', onkeypress)
 break_event = plt.connect('key_press_event', break_loop)
 plt.show()
 globSelect.disconnect()
车辆识别

要检测视频中的汽车,我使用Mask-
RCNN。它是一个卷积神经网络,对来自几个数据集(包括COCO数据集)的数百万个图像和视频进行了训练,以检测各种对象及其边界。 Mask-
RCNN建立在Faster-RCNN对象检测模型的基础上。

除了每个检测到的对象的类标签和边界框坐标外,Mask RCNN还将返回图像中每个检测到的对象的像pixel-wise mask。这种pixel-wise
masking称为“ 实例分割”。我们在计算机视觉领域所看到的一些最新进展,包括自动驾驶汽车、机器人等,都是由实例分割技术推动的。

M-RCNN将用于视频的每一帧,它将返回一个字典,其中包含边界框坐标、检测对象的masks、每个预测的置信度和检测对象的class_id。现在使用class_ids过滤掉汽车,卡车和公共汽车的边界框。然后,我们将在下一步中使用这些框来计算IoU。

由于Mask-RCNN比较复杂,这里篇幅有限,需要mask-RCNN的同学联系博主获取, 下面仅展示效果:

在这里插入图片描述

最后

🧿 更多资料, 项目分享:

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

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

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

相关文章

干货分享|腾讯内部项目管理PPT

我是胖圆,欢迎大家关注留言~ 或者移步公众号【胖圆说PM】找我~

HashMap -- 调研

HashMap 调研 前言JDK1.8之前拉链法: JDK1.8之后JDK1.7 VS JDK1.8 比较优化了一下问题: HashMap的put方法的具体流程?HashMap的扩容resize操作怎么实现的? 前言 在Java中,保存数据有两种比较简单的数据结构:数组和链表。 数组的特点是:寻址容易,插入…

Java实现防重复提交,使用自定义注解的方式

目录 1.背景 2.思路 3.实现 创建自定义注解 编写拦截器 4.使用 5.验证 6.总结 1.背景 在进行添加操作时,防止恶意点击,后端进行请求接口的防重复提交 2.思路 通过拦截器搭配自定义注解的方式进行实现,拦截器拦截请求,使…

如何在 Keras 中开发具有注意力的编码器-解码器模型

link 【翻译自 : How to Develop an Encoder-Decoder Model with Attention in Keras 】 【说明:Jason Brownlee PhD大神的文章个人很喜欢,所以闲暇时间里会做一点翻译和学习实践的工作,这里是相应工作的实践记录,…

大数据Doris(八):启动FE步骤

文章目录 启动FE步骤 一、配置环境变量 二、​​​​​​​创建doris-mate

变分自动编码器 (VAE)02/2 PyTorch 教程

一、说明 在自动编码器中,来自输入数据的信息被映射到固定的潜在表示中。当我们旨在训练模型以生成确定性预测时,这特别有用。相比之下,变分自动编码器(VAE)将输入数据转换为变分表示向量(顾名思义&#xf…

气象台卫星监测vr交互教学增强学生的学习兴趣和动力

对地观测是以地球为研究对象,依托卫星、飞船等光电仪器,进行各种探测活动,其核心是遥感技术,因此为了让遥感专业学员能提前熟悉对地观测规则、流程、方法及注意事项,借助VR虚拟现实制作的三维仿真场景,能让…

全新彩虹商城时光模板知识付费系统源码+内有5000多商品+易支付源码

源码简介: 全新彩虹商城时光模板知识付费系统源码,这是最新的彩虹知识付费商城系统,具备众多强大且实用的功能。首先,它支持二级分类和多级分销,使得商品分类更为清晰,销售网络更具扩展性。 其次&#xf…

机器人轨迹规划算法的研究现状

近年来,随着机器人技术的迅速发展,机器人在工业、医疗、军事等领域的应用越来越广泛。机器人轨迹规划是机器人控制的重要环节之一,它决定了机器人在执行任务时的运动轨迹,直接影响机器人的精度、速度和稳定性。因此,机…

【PCIE720】基于PCIe总线架构的高性能计算(HPC)硬件加速卡

PCIE720是一款基于PCI Express总线架构的高性能计算(HPC)硬件加速卡,板卡采用Xilinx的高性能28nm 7系列FPGA作为运算节点,在资源、接口以及时钟的优化,为高性能计算提供卓越的硬件加速性能。板卡一共具有5个FPGA处理节…

代码混淆界面介绍

代码混淆界面介绍 代码混淆功能包括oc,swift,类和函数设置区域。其他flutter,混合开发的最终都会转未oc活着swift的的二进制,所以没有其他语言的设置。 代码混淆功能分顶部的显示控制区域:显示方式,风险等…

python 深度学习 解决遇到的报错问题6

目录 一、解决报错HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /bert-base-uncased/resolve/main/vocab.txt (Caused by ConnectTimeoutError(, Connection to huggingface.co 如何从huggingface官网下载模型 二、nx.draw if cf._ax…

jupyter 切换虚拟环境

当前只有两个环kernel 我已经创建了很多虚拟环境,如何在notebook中使用这些虚拟环境呢?请看下面 比如说我要添加nlp 这个虚拟环境到notebook中 1. 切换到nlp环境 2. 安装如下模块 pip install ipykernel 3. 执行如下命令 python -m ipykernel install …

VS2019如何显示和去除控制台页面

这是控制台页面: 方法: 选中目标项目,右键--->属性--->配置属性--->链接器--->系统--->子系统--->(窗口/控制台)

地级市HVV | 未授权访问合集

在网站前后端分离盛行下,将大部分权限控制交给前端,导致js中隐藏未授权或者可绕过的前端鉴权。前后端分离的好处是提高开发效率,同时防止黑客更直接的对服务器造成危害,但权限控制的工作量全部交给前端会导致大量页面未授权或者后…

面试经典 150 题 1 —(双指针)— 125. 验证回文串

125. 验证回文串 方法一 class Solution { public:bool isPalindrome(string s) {string newStr "";for(int fast 0; fast < s.size(); fast){if(isalnum(s[fast]))){newStr tolower(s[fast]);}}string tmp newStr;reverse(tmp.begin(), tmp.end());if(strcm…

【计算机网络】TCP协议与UDP协议详解

文章目录 一、传输层 1、1 再次理解传输层 1、2 再次理解端口号 1、2、1 端口号范围划分 1、2、2 认识知名端口号 1、3 网络常用指令netstat 与 pidof 二、UDP协议 2、1 UDP协议的报文 2、2 UDP的特点 2、3 UDP的缓冲区 三、TCP协议 3、1 TCP协议的报文 3、2 确认应答 3、3 按…

计算机毕业设计选什么题目好?springboot 个人健康信息管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

基于SpringBoot的抗疫物资管理系统

目录 前言 一、技术栈 二、系统功能介绍 用户管理 公告信息管理 轮播图管理 物质分类管理 物质信息管理 物质入库管理 物质出库管理 个人信息 前台首页功能实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着现在网络的快速发展&#xff0c;网…

简单制作RT-Thread Studio的CH32V303的BSP支持包

简单制作RT-Thread Studio的CH32V303的BSP支持包 开原仓库链接在此&#xff1a;RTT_Studio_BSP_CH32V303 参考 CH32V307V-R1&#xff08;V1.0.8&#xff09;的 BSP&#xff0c;更新了外设驱动库之类的。 可以在 RT-Thread SDK 管理器中导入离线资源包&#xff0c;可以新建 RT…