【毕业设计】机器视觉停车位识别检测系统 - python 深度学习

news2024/10/3 2:14:18

文章目录

  • 1 简介
  • 2 检测效果
  • 3 实现方式
    • 3.1 整体思路
    • 3.2 检测空车位
    • 3.3 车辆识别
  • 4 最后

1 简介

🔥 Hi,大家好,这里是丹成学长的毕设系列文章!

🔥 对毕设有任何疑问都可以问学长哦!

这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是

🚩 基于机器视觉的停车位识别检测

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

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

🧿 选题指导, 项目分享:

https://gitee.com/yaa-dc/BJH/blob/master/gg/cc/README.md

2 检测效果

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

车辆移动到其他车位

在这里插入图片描述

3 实现方式

3.1 整体思路

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

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

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

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

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

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

3.2 检测空车位

车位探测系统的第一步是识别停车位。有一些技巧可以做到这一点。例如,通过在一个地点定位停车线来识别停车位。这可以使用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()

(PS: 若代码出现bug可反馈博主, 及时修改)

3.3 车辆识别

要检测视频中的汽车,我使用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的同学联系博主获取, 下面仅展示效果:

在这里插入图片描述

4 最后

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

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

相关文章

【面试题】「2023」JavaScript 最新高频 前端面试题 指南 (必看)

前言 大家好,本次总结了关于JavaScript的上百道高频面试考点,感谢大家的留言点赞收藏 💗 如果文中有不对、疑惑或者错字的地方,欢迎在评论区留言指正🌻 更多题库 地址:前端面试题库 基础篇 1. 将数组的…

【微前端开发环境下,加载远程子应用的实战。】

一开始我们的本地开发运行的环境,如果没有启动子应用的话。对应的页面是白屏的。 问题: 当有关联资源需要跳转时无法跳转,需要额外打开一个浏览器tab页到环境上面执行操作。当bug类型为纯ui-server端的内容时,需要手动启动bug相关…

【数据库原理及应用】——事务并发控制和恢复技术(学习笔记)

📖 前言:事务是数据库操作的基本逻辑单元,事务处理技术主要包括数据库并发控制技术和恢复技术。本章首先介绍了事务的基本概念和四个特性,然后讨论事务并发操作可能引起数据库的不一致性,继而引入数据库的并发控制技术…

Compare线刷包与卡刷包

Android系统分为卡刷包和线刷包 小米11线刷包 从该版本的boot.img中抽取出的内容如下图 小米11卡刷包 从该版本的boot.img中可以提取的内容是 也就是说,想要做配置文件抽取需要用线刷包。经过测试,目前高版本的卡刷包通过解压都无法获取到boot.img…

图像分割 - 阈值处理 - 固定阈值法

目录 1. 介绍 2. 固定阈值处理 1. 介绍 图像分割就是将图像分成不同的区域,每个区域满足相似的条件。通常,都是将图像分为两个区域:前景区域和背景区域。 前景就是人们感兴趣的位置,例如一副Lena图像,我们只对这副图…

Redis-Mysql八股总结

Redis 说一下 Redis以及Redis 使用场景 答:Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。 Redis 设置过期时间的命令 # 设置 key 在…

上网行为监控都能审计到哪些内容?

现在很多企业都部署了上网行为监控系统,那么,它可以审计到哪些内容呢?目前市面上有不同种类的上网行为监控系统,其功能都是大同小异的,这里我们以墨门云为例,了解一下装了这个软件之后管理者可以审计到哪些…

WPF探究【一】

文章目录WPF的概述:控件分类XAML对象元素语法XAML根元素WPF和XAML命名空间声明控件Lablel示例继承关系TextBlockbuttonBorderWPF的概述: WindowsPresentationFoundation(简称WPF)WPF的核心是一个与分辩率无关且基于实量的呈现引擎…

【深入理解Kotlin协程】使用Job控制协程的生命周期

Job 是协程上下文CoroutineContext的实现之一,通过它我们可以对协程的生命周期进行一些控制操作。Job 是协程的句柄。使用 launch 或 async 创建的每个协程都会返回一个 Job 实例对象,该实例是相应协程的唯一标识并管理其生命周期。还可以将 Job 传递给 …

数据结构与算法(四) 广度优先搜索

本篇文章继续来学习广度优先搜索算法(Broad-First-Search,BFS) 1、本质 广度优先搜索本质上还是遍历整个搜索空间,找到给定问题的解 实际上也是一种暴力搜索算法,不过其中的实现细节和优化细节还是值得探讨的 与深度…

基于PHP+MySQL的大学生交友社交网站

近年来,大学生的数量在逐步的增加,为了能够让这些大学生有一个更好的交友环境,需要创建一个基于大学生的社交交友网站。这样可以拉近彼此大学生之间的感情,让他们可以更好的进行学习和交流。 PHP大学生交友社交网站通过PHP:MySQL进行开发,分为前台和后台两部分,通过…

线程的状态

Java中线程的状态是通过枚举类型Thread.State表示的 ,通过打印这些枚举类型,就可以知道java中线程的状态有哪些 public class ThreadState {public static void main(String[] args) {for (Thread.State state : Thread.State.values()) {System.out.pr…

进销存管理系统是什么?有哪些功能?

对于2022年刚开始,但是可以的确的是禽流感在短时期内是不可能返回他们,作为虚拟店面批发商想勇往直前中,就必须要亲吻网络,把销售业务从实体店搬至线上去。 想突破现状,化解虚拟店面批发民营企业的存活问题&#xff0…

ES初使用记录——写入与查询数据

本周接到一个任务:定时统计订单表中的数据,将异常订单挑出来,放入ES中供统计页面从总数点击跳转过去进行列表展示。 一、配置ES 配置maven,注入template Resource private ElasticsearchTemplate elasticsearchTemplate; 二、…

一、OBS概述

1. 概述 obs官网git源码编译 2. 软件能力 输入:文本、图片、窗口、音视频及摄像头等 处理:视频及图片滤镜、音频混音等 输出:rtmp推流、本地录制(mp4)、音视频裸数据(pcm/yuv/rgb)等 3. 模块 a. core核心模块 libobs 加载、管理各个功能…

Ansys Zemax | 大功率激光系统的STOP分析2:如何进行光机械设计准备

大功率激光器广泛用于各种领域当中,例如激光切割、焊接、钻孔等应用中。由于镜头材料的体吸收或表面膜层带来的吸收效应,将导致在光学系统中由于激光能量吸收所产生的影响也显而易见,大功率激光器系统带来的激光能量加热会降低此类光学系统的…

性能测试面试题总结(答案全)

目录 1.什么是负载测试?什么是性能测试? 2.性能测试包含了哪些测试(至少举出3种) 3.简述性能测试的步骤 4.什么时候可以开始执行性能测试? 5.你如何在负载测试模式下执行功能测试? 6.响应时间和吞吐量…

时序数据库 InfluxDB

一、介绍 InfluxDB 是一个时间序列数据库,GO 编写的,旨在处理高写入和查询负载。InfluxDB 旨在用作涉及大量时间戳数据的任何用例的后备存储,包括 DevOps 监控、应用程序指标、物联网传感器数据和实时分析。 特点: 专门为时间序列数据编写的…

格式工厂安装与使用教程

格式工厂支持各种类型视频、音频、图片、word转pdf等多种格式的免费转换,是一款非常优秀的良心软件。 在电脑浏览器中打开下载地址http://www.pcgeshi.com/index.html , 单击"立即下载"按钮即可。 打开下载的文件,等待安装即可。&#xff08…

标记肽Bz-Pro-Phe-Arg-pNA、59188-28-2

血浆激肽释放酶,cruppain和胰蛋白酶的显色底物。编号: 140214 中文名称: 标记肽Bz-PFR-对硝基苯胺 英文名: Bz-Pro-Phe-Arg-pNA CAS号: 59188-28-2 单字母: Bz-PFR-pNA 三字母: Benzoyl-Pro-Phe-Arg-pNA 氨基酸个数: 3 分子式: C33H38O6N8 平均分子量: 642.7 精确分…