当前位置: 首页 > news >正文

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

简介

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

该项目可推荐用于毕业设计

毕设帮助,开题指导,资料分享,疑问解答(见文末)

🧿选题指导, 项目分享:见文末

检测效果

废话不多说, 先上效果图


注意车辆移动后空车位被标记上

车辆移动到其他车位

实现方式
整体思路

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

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

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

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

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

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

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

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

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

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

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

importosimportnumpyasnpimportcv2importpickleimportargparseimportmatplotlib.pyplotaspltfrommatplotlib.patchesimportPolygonfrommatplotlib.widgetsimportPolygonSelectorfrommatplotlib.collectionsimportPatchCollectionfromshapely.geometryimportboxfromshapely.geometryimportPolygonasshapely_poly points=[]prev_points=[]patches=[]total_points=[]breaker=FalseclassSelectFromCollection(object):def__init__(self,ax):self.canvas=ax.figure.canvas self.poly=PolygonSelector(ax,self.onselect)self.ind=[]defonselect(self,verts):globalpoints points=verts self.canvas.draw_idle()defdisconnect(self):self.poly.disconnect_events()self.canvas.draw_idle()defbreak_loop(event):globalbreakerglobalglobSelectglobalsavePathifevent.key=='b':globSelect.disconnect()ifos.path.exists(savePath):os.remove(savePath)print("data saved in "+savePath+" file")withopen(savePath,'wb')asf:pickle.dump(total_points,f,protocol=pickle.HIGHEST_PROTOCOL)exit()defonkeypress(event):globalpoints,prev_points,total_pointsifevent.key=='n':pts=np.array(points,dtype=np.int32)ifpoints!=prev_pointsandlen(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()globalglobSelectglobalsavePath savePath=args.out_fileifargs.out_file.endswith(".p")elseargs.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=Nonewhilevideo_capture.isOpened():success,frame=video_capture.read()ifnotsuccess:breakifcnt==5:rgb_image=frame[:,:,::-1]cnt+=1video_capture.release()whileTrue: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可反馈博主, 及时修改)

车辆识别

要检测视频中的汽车,我使用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.cnnetsun.cn/news/8219.html

相关文章:

  • 19、高级Shell编程与正则表达式过滤器
  • PHP兼容性检查工具完整指南
  • 基于元胞自动机交通模型的三车道Matlab代码:模拟车辆多车道行驶及可视化分析系统
  • 豆包手机二手价被炒到3.6万元;被曝开发“芯片定位”技术,英伟达:这不是后门;千问月活突破3000万 | 极客头条
  • Wan2.2-T2V-A14B适合哪些行业?五大垂直领域推荐
  • 基于西门子S7-200PLC的自动灌溉系统组态王组态 带解释的梯形图程序,接线图原理图图纸,io分配
  • 机器学习驱动的智能化电池管理技术与应用
  • 如何优化MinerU项目的PaddleOCR模型部署效率
  • SVG.js动画开发终极指南:从入门到精通
  • Python 对象序列化与存储库pickle详细介绍
  • 圣诞快乐!来自代码世界的祝福
  • 一致性的威力:AI如何在B/G端释放数据治理的真正生产力
  • 知行之桥三种接口详解:Webhook、Flow API 与 Admin API
  • CPFEM晶塑动态展示:VUMAT子程序高效率与多维度模型应用测试
  • 毕业设计实战:基于SpringBoot+MySQL的旅游网站设计与实现,从需求到测试全流程拆解,新手也能轻松通关!
  • 如何在没有电脑的情况下备份 iPhone
  • Python HTTPX性能优化实战:10个技巧解决90%的连接问题
  • 空调加热器MPC模型预测控制程序与修正Kalman滤波:附简洁文献与附图与运行指南
  • Spring Boot日志文件未生成问题排查
  • 2025CRM选型手册:主流CRM品牌客户 - 销售 - 团队管理能力 场景化对比
  • AI口碑决胜未来:2025年智能洞察与AI市场舆情分析平台深度对决
  • 5分钟掌握Nginx LDAP认证系统部署技巧
  • 基于否定选择算法的异常检测技术详解
  • 手把手根治Qwen-Agent工具重复调用:实战优化指南
  • 系统管理shutdown命令
  • AOT 与 GraalVM Native Image 深度解析
  • 告别单位换算烦恼!进销存软件让生意更省心
  • KAT-V1-40B:重新定义大模型推理效率的AutoThink技术革命
  • 计算机毕业设计springboot灾区物资管理系统 基于SpringBoot的灾后救援物资调配平台 SpringBoot驱动的应急物资供应链管理系统
  • 关于人工智能和就业的一线希望