news 2026/5/25 17:21:10

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
毕设 基于机器视觉的停车位识别检测
简介

你是不是经常在停车场周围转来转去寻找停车位。如果你的车辆能准确地告诉你最近的停车位在哪里,那是不是很爽?事实证明,基于深度学习和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的同学联系博主获取, 下面仅展示效果:

🧿 项目分享:大家可自取用于参考学习,获取方式见文末!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 2:28:43

adb命令大全

1、退出终端最常用的退出命令是 exit 或 logout,直接输入后回车即可。使用快捷键 Ctrl D 来达到同样的效果。

作者头像 李华
网站建设 2026/5/26 6:21:44

29、Linux基础:TCP/IP服务与系统信息管理

Linux基础:TCP/IP服务与系统信息管理 1. 学习Linux的意义与基础铺垫 在网络自动化领域,掌握Linux技能是非常重要的。虽然并非每个学习者都想成为专业的Linux管理员,但具备一定的Linux知识,在复杂生产环境中会有很大的帮助。很多Python网络自动化资源往往忽略了良好Linux管…

作者头像 李华
网站建设 2026/5/26 5:34:00

Android摄像头调试神器:v4l2 camera apk全方位指南

Android摄像头调试神器:v4l2 camera apk全方位指南 【免费下载链接】Androidv4l2cameraapk资源介绍 Android v4l2 camera apk是一款专为开发者设计的摄像头功能实现工具,支持在Android设备上进行摄像头预览和调试。它兼容多种Android版本,提供…

作者头像 李华
网站建设 2026/5/26 9:39:30

鸿蒙 Electron 跨生态协同:与 Windows/macOS/Android 互联互通实战

鸿蒙Electron跨生态协同:与Windows/macOS/Android互联互通实战 在多系统并存的办公与生活场景中,单一设备的能力边界始终有限。鸿蒙Electron凭借鸿蒙系统的分布式软总线技术,打破了Windows、macOS、Android与鸿蒙设备之间的壁垒,…

作者头像 李华
网站建设 2026/5/26 4:37:37

Manus与LangChain智能体实战经验!DeepMind工程师的上下文工程哲学

随着大模型能力的边界不断拓展,我们构建智能体的方式正在经历一场静悄悄却剧烈的范式转移,核心不再是堆砌更复杂的提示词,而是学会如何优雅地让路。Google DeepMind 工程师 Philipp Schmid,总结了 Manus 创始人 Peak Ji&#xff0…

作者头像 李华