毕业设计 深度学习 机器视觉 车位识别车道线检测 - python opencv

news/2024/5/19 12:58:45/文章来源:https://blog.csdn.net/HUXINY/article/details/127232833

0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

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

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

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

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

🧿 选题指导, 项目分享:

https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md

简介

你是不是经常在停车场周围转来转去寻找停车位。如果你的车辆能准确地告诉你最近的停车位在哪里,那是不是很爽?事实证明,基于深度学习和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_polypoints = []
prev_points = []
patches = []
total_points = []
breaker = Falseclass SelectFromCollection(object):def __init__(self, ax):self.canvas = ax.figure.canvasself.poly = PolygonSelector(ax, self.onselect)self.ind = []def onselect(self, verts):global pointspoints = vertsself.canvas.draw_idle()def disconnect(self):self.poly.disconnect_events()self.canvas.draw_idle()def break_loop(event):global breakerglobal globSelectglobal savePathif 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_pointsif 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 = pointsif __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 globSelectglobal savePathsavePath = 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=0rgb_image = Nonewhile video_capture.isOpened():success, frame = video_capture.read()if not success:breakif cnt == 5:rgb_image = frame[:, :, ::-1]cnt += 1video_capture.release()while True:fig, ax = plt.subplots()image = rgb_imageax.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可反馈博主, 及时修改)

车辆识别

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

在这里插入图片描述

最后

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Airflow学习笔记

CSDN话题挑战赛第2期 参赛话题:学习笔记 项目中解决的问题 使用airflow调度hive脚本跑批任务 视频教程上整理知识点 学习视频:https://www.bilibili.com/video/BV1V7411K7Gy?p40&vd_sourceb002288652bae647c598ddf77f79a7b8 Airflow基本概念 Airfl…

【VUE2开发20221004】-day1.0

目录测试案例1:Vue常见指令:1、插值表达式2、v-bind指令v-bind指令注意事项简写v-bindv-bind属于单向绑定(JS修改->HTML修改)3、v-model指令v-model常用标签4、v-for指令5、v-on事件前端开发教程链接 vuejs官方教程 框架&…

刷题笔记-栈帧

例题1 阅读如下C代码片段(其中Y表示代码指令地址): void overflow(char* pShellcode, int iLen) { Y1:char buffer[8]; Y2: memcpy(buffer, pShellcode, dwLen); Y3: „„ } Y4: int main() { Y5: „„ Y6: overflow("123…

多处理机的基本概念

本文内容是作者在进行计算机组成原理复习的时候,用王道的视频做笔记或者保存图的内容。后续如果看了其他书或者有其他理解会进行增加内容。 SISD(单指令流数据流) 特性:各指令序列只能并发、不能并行,每条指令处理一…

Prophet算法

Prophet简介 Prophet是FaceBook公司在2017年开源的一款时间序列建模工具。Prophet的方法是将时间序列看成是关于t的一个函数,用你和函数曲线的方法进行预测,所以这和传统的时间序列模型有本质上的区别,他更倾向于机器学习的建模方式。 Prop…

PO/PI

典型集成场景 PI总体架构

浅学设计模式(二)

目录: (1)工厂模式 简单工厂: 工厂方法模式: (2)抽象工厂模式 (1)工厂模式 简单工厂: 原来的方式使用new: 需要关心细节,如何创建对…

独家分享 圆梦阿里之后,我得到了这份SpringCloud Alibaba源码文档

Spring Cloud Alibaba为分布式应用开发提供了一站式解决方案。它包含开发分布式应用程序所需的所有组件,可以轻松地使用Spring Cloud开发应用程序。 使用Spring Cloud Alibaba,只需添加一些注解和少量配置,即可将Spring Cloud应用连接到Alib…

Spring 4 IOC 相关内容 4.2 bean 实例化 3 实例工厂实例化

Spring 【黑马程序员2022新版SSM框架教程_SpringSpringMVCMaven高级SpringBootMyBatisPlus企业实用开发技术】 4 IOC 相关内容 文章目录Spring4 IOC 相关内容4.2 bean 实例化4.2.5 实例工厂与FactoryBean4.2.6 bean 实例化小结4.2 bean 实例化 4.2.5 实例工厂与FactoryBean …

Python学习笔记(四)——字符串与文本处理2

目录 字符串函数大合集 两端删除函数strip() 删除空白字符 删除两端指定字符 右端删除函数rstrip() 左端删除函数 字符串对齐 返回指定宽度字符串center() 原字符串居中对齐、左对齐、右对齐 字符串开始或结束符判定startswith()、endswith() 内置函数eval()&#x…

web期末作业设计网页 html+css+js制作非物质文化遗产坝漆国漆 2页

🌩️ 精彩专栏推荐👇🏻👇🏻👇🏻 💂 作者主页: 【进入主页—🚀获取更多源码】 🎓 web前端期末大作业: 【📚HTML5网页期末作业 (1000套…

鉴源论坛丨民用飞机机载软件是如何表明适航符合性的

作者 | 蔡喁 上海控安可信软件创新研究院副院长 版块 | 鉴源论坛 观擎 01 机载软件的基本特征 机载计算机在现代飞机各组成部分中占有举足轻重的位置,是现代航空电子系统的基础和核心,其研制、生产和应用水平已成为衡量飞机先进性的重要标志。机载计…

【面试题】Java基础 2

若你困于无风之地,我将为你奏响高空之歌 文章目录一、int 和 Integer 对象1. int 和 Integer 对象的区别2. 变量比较问题:二、反射1. 反射机制定义2. 反射的使用步骤3. 一个小栗子4. 反射的应用一、int 和 Integer 对象 1. int 和 Integer 对象的区别 …

css 特效实现方法

背景渐隐 通过 before 线性渐变遮盖掉一部分图片 视察滚动实现方式: 监听浏览器滚动事件改变各个层的top值 环形进度条 svg circlestroke-dasharray 环绕边框动画 四个单向运动的动画父框overflow: hidden;设置延迟可表现循环 一些旋转曲线的图形 inset背景扩…

一维无界的自由波动问题-达朗贝尔行波解

回顾 第一个例子 表示热能的扩散,在空间有不同的取值,随空间和时间而变化,左端是跟一个恒温为0的热源接触,我们表示为,这个叫恒温条件。右端我们跟一个绝热的材料接触,傅里叶发现了热传导规律,K叫做热传导…

Java学习笔记 --- 面向对象之多态

一、基本介绍 方法或对象具有多种形态,是面向对象的三大特征,多态是建立在封装和继承之上的 二、多态的具体体现 1、方法的多态: 重写和重载就体现多态 案例演示: package com.javase.poly_;public class PloyMethod {publi…

最新案例 | 昇思MindSpore携手信大网御推出中原AI反诈骗创新解决方案,为全民反诈筑牢防火墙

近日,河南信大网御科技有限公司的中原人工智能反诈骗创新解决方案与华为Atlas 800训练服务器和全场景AI框架昇思MindSpore完成兼容性测试。该方案基于昇腾AI基础软硬件平台,能够在短时间内对涉诈网址/APP进行识别,识别准确率高达99%。 据2021…

嵌入式开发为什么用C语言

有了解过嵌入式开发的人都会想要多去了解一些嵌入式方面的信息,那么既然是嵌入式开发肯定是要你会代码的,至于这些可能你还不是很了解,下面可以一起来了解下嵌入式开发为什么用C语言吧。 点击获取1V1嵌入式学习规划,现在还送100G精…

牛客网刷题-两个队列实现栈

✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页:rivencode的个人主页 🔥系列专栏:《牛客网刷题》 💬推…

字节跳动测试岗面试挂在2面,我复盘总结了失败原因,决定再战一次

先说下我基本情况,本科不是计算机专业,现在是学通信,然后做图像处理,可能面试官看我不是科班出身没有问太多计算机相关的问题,因为第一次找工作,字节的游戏专场又是最早开始的,就投递了&#xf…