项目背景与意义(智慧停车、城市交通管理) 基于Python的opencv的停车场车位检测与空余车位计数

项目背景与意义(智慧停车、城市交通管理) 基于Python的opencv的停车场车位检测与空余车位计数

基于Python的opencv的停车场车位检测与空余车位计数项目,

在这里插入图片描述

若预装了环境(Python及其相应库)直接可跑。

在这里插入图片描述


1

在这里插入图片描述


1

在这里插入图片描述
  • ✅ 实时视频流/图片输入
  • ✅ 车位区域框选与编号标注
  • ✅ 车辆占用状态识别(红框= occupied, 绿框= free)
  • ✅ 空余车位计数显示(FREE: 1)
  • ✅ 可视化界面输出

这是一个非常经典且实用的计算机视觉项目,适合初学者入门和毕业设计。

🚗 完整可运行代码(含超详细注释)

以下代码基于 opencv-pythonnumpy,无需深度学习模型,纯传统图像处理实现,小白也能看懂!

📁 文件结构建议:

parking_detector/ ├── main.py # 主程序 ├── parking_spaces.png # 停车位模板图(用于标定坐标) └── video.mp4 # 测试视频(可选) 

✅ 第一步:安装依赖库

pip install opencv-python numpy 
💡 如果你使用的是 Anaconda 或已预装环境,跳过此步。

✅ 第二步:主程序代码 main.py

import cv2 import numpy as np import time # ==================== 配置区 ====================# 1. 视频源路径(可以是摄像头、视频文件或图片) VIDEO_SOURCE =0# 0 表示默认摄像头;也可填 "video.mp4" 或 "image.jpg"# 2. 停车位坐标列表 [x1, y1, x2, y2] —— 需要根据你的实际画面手动标定!# 示例数据(请替换为你自己画面的真实坐标) PARKING_SPACES =[[7689,0,8489,150],# 车位1[8489,0,9289,150],# 车位2[9289,0,10089,150],# 车位3[10089,0,10889,150],# 车位4[10889,0,11689,150],# 车位5[11689,0,12489,150],# 车位6[7554,150,8354,300],# 车位7[8354,150,9154,300],# 车位8[9154,150,9954,300],# 车位9[9954,150,10754,300],# 车位10[10754,150,11554,300],# 车位11[11554,150,12354,300]# 车位12]# 3. 车位编号标签(对应每个车位的数字) SPACE_LABELS =["7689","8489","9439","7641","8703","5944","7554","8354","9218","7455","994","441"]# 4. 颜色定义 COLOR_OCCUPIED =(0,0,255)# 红色 - 有车 COLOR_FREE =(0,255,0)# 绿色 - 空闲 COLOR_TEXT =(255,255,255)# 白色文字 FONT = cv2.FONT_HERSHEY_SIMPLEX FONT_SCALE =0.6 THICKNESS =2# ==================== 函数定义 ====================defget_parking_status(frame, space_coords):""" 判断一个车位是否被占用 方法:计算车位区域内像素的平均亮度变化(简单有效) 如果当前帧比背景暗很多 → 认为有车 """ x1, y1, x2, y2 = space_coords roi = frame[y1:y2, x1:x2]# 截取车位区域if roi.size ==0:returnFalse# 防止越界# 转换为灰度图并计算平均亮度 gray_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) avg_brightness = np.mean(gray_roi)# 阈值判断:如果平均亮度低于某个值(比如 100),认为有车# 这个阈值需要根据实际光照调整! THRESHOLD_BRIGHTNESS =100 is_occupied = avg_brightness < THRESHOLD_BRIGHTNESS return is_occupied defdraw_parking_info(frame, spaces, labels, statuses):""" 在画面上绘制车位框、编号、状态 """ free_count =0for i,(space, label, status)inenumerate(zip(spaces, labels, statuses)): x1, y1, x2, y2 = space color = COLOR_OCCUPIED if status else COLOR_FREE ifnot status: free_count +=1# 画矩形框 cv2.rectangle(frame,(x1, y1),(x2, y2), color, THICKNESS)# 画编号标签 cv2.putText(frame, label,(x1, y1 -10), FONT, FONT_SCALE, COLOR_TEXT, THICKNESS)# 显示空余车位数量 cv2.putText(frame,f"FREE: {free_count}",(50,50), FONT,1.5,(0,255,255),3)return frame, free_count # ==================== 主程序 ====================defmain():print("🚗 启动停车场车位检测系统...")print("📌 提示:首次运行请先用图片标定好 PARKING_SPACES 坐标!")# 打开视频源 cap = cv2.VideoCapture(VIDEO_SOURCE)ifnot cap.isOpened():print("❌ 无法打开视频源,请检查路径或摄像头连接!")return# 创建窗口 cv2.namedWindow("Parking Detector", cv2.WINDOW_NORMAL)whileTrue: ret, frame = cap.read()ifnot ret:break# 视频结束或读取失败# 获取每个车位的状态 statuses =[]for space in PARKING_SPACES: status = get_parking_status(frame, space) statuses.append(status)# 绘制结果 result_frame, free_count = draw_parking_info(frame.copy(), PARKING_SPACES, SPACE_LABELS, statuses)# 显示画面 cv2.imshow("Parking Detector", result_frame)# 按 'q' 退出if cv2.waitKey(1)&0xFF==ord('q'):break# 释放资源 cap.release() cv2.destroyAllWindows()print("✅ 系统已关闭。")if __name__ =="__main__": main()

🧭 如何标定你的车位坐标?

由于每张图片/视频的分辨率和视角不同,你需要手动标定 PARKING_SPACES 中的坐标。

方法一:使用 OpenCV 鼠标点击获取坐标

创建一个辅助脚本 get_coordinates.py

import cv2 defclick_event(event, x, y, flags, param):if event == cv2.EVENT_LBUTTONDOWN:print(f"Clicked at: ({x}, {y})") img = param.copy() cv2.circle(img,(x, y),5,(0,0,255),-1) cv2.imshow("Image", img)# 加载你的停车场图片 img = cv2.imread("parking_spaces.png") cv2.imshow("Image", img) cv2.setMouseCallback("Image", click_event, img)print("💡 点击每个车位的左上角和右下角,记录坐标!")print("按任意键退出...") cv2.waitKey(0) cv2.destroyAllWindows()

运行后,点击图片中每个车位的两个对角点,控制台会输出坐标,复制粘贴到 PARKING_SPACES 列表中即可。


📊 输出效果说明

  • 🔴 红色框 + 数字 → 车位被占用
  • 🟢 绿色框 + 数字 → 车位空闲
  • 📊 左上角 “FREE: X” → 当前空余车位总数

🎯 进阶优化建议(可选)

  1. 动态背景建模:使用 cv2.createBackgroundSubtractorMOG2() 自动适应光照变化。
  2. 多尺度支持:自动缩放坐标适配不同分辨率视频。
  3. 数据库存储:将每次检测结果存入 MySQL,生成历史报表。
  4. Web 界面:用 Flask + Vue 做成网页版监控系统。
  5. 深度学习替代:改用 YOLOv8 检测车辆,精度更高(但需要训练)。

📄 报告撰写要点(供参考)

你可以围绕以下内容写报告:

  • 项目背景与意义(智慧停车、城市交通管理)
  • 技术选型理由(为什么用 OpenCV 而不是深度学习?)
  • 核心算法原理(亮度阈值法、ROI 提取)
  • 实验过程(如何标定坐标、测试不同场景)
  • 结果分析(准确率、局限性、改进方向)
  • 未来展望(接入 IoT、移动端推送等)

✅ 总结

  • ✔️ 基于 Python + OpenCV
  • ✔️ 包含完整代码 + 超级详细注释
  • ✔️ 小白也能看懂和修改
  • ✔️ 直接可跑(只要配置好坐标)
  • ✔️ 可扩展性强,适合做毕业设计或课程设计

🎉

Read more

Vue第四篇:组件通信 + DOM 更新 + 过渡动画

Vue 组件化开发中,组件之间传数据(组件通信)是核心需求,DOM 更新时机、元素动效也是前端开发高频场景。 一、自定义事件:子组件向父组件通信的优雅方式 为什么需要自定义事件? 在父组件中,我们通过props向子组件传递数据。但当子组件需要向父组件传递数据时,就需要自定义事件了。 核心作用 自定义事件是子组件给父组件传数据的专属方式(只能子传父)。原理很简单:父组件给子组件绑定一个自定义事件,子组件触发这个事件并传递数据,事件的回调函数写在父组件里,就能轻松拿到子组件的数据。 两种绑定方式对比 方式1:直接在模板中绑定(简洁) <!-- 父组件 App.vue --><template><div><!-- 通过@绑定自定义事件 --><ChildComponent @child-event=

By Ne0inhk

小白入门:前端前端调用 AI 接口全流程(附具体案例)

很多前端新手在调用 AI 接口时会犯怵:不知道 “怎么怎么传参数?”“流式响应怎么处理?”“不同功能(润色 / 扩写)调用方式不一样吗?” 其实很简单!本文以 “智能文本处理工具” 为例,手把手教你从 0 到 1 调用 AI 接口,包含润色、扩写等功能,看完就能上手。 准备工作:先看懂这 3 个核心文件 在开始前,我们需要明确项目中 3 个关键文件的作用(这些文件你可能已经有了,只是不知道怎么用): * vite.config.js:配置后端接口代理,解决跨域问题 * apiClient.js:封装好的 HTTP 请求工具,帮你发请求 * aiService.js:封装好的 AI 功能函数(

By Ne0inhk
一文了解Blob文件格式,前端必备技能之一

一文了解Blob文件格式,前端必备技能之一

文章目录 * 前言 * 一、什么是Blob? * 二、Blob的基本特性 * 三、Blob的构造函数 * 四、常见使用场景 * 1. 文件下载 * 2. 图片预览 * 3. 大文件分片上传 * 四、Blob与其他API的关系 * 1. File API * 2. FileReader * 3. URL.createObjectURL() * 4. Response * 五、性能与内存管理 * 六、实际案例:导出Word文档 * 七、浏览器兼容性 * 八、总结 前言 最近在项目中需要导出文档时,我首次接触到了 Blob 文件格式。作为一个前端开发者,虽然经常听到 "Blob" 这个术语,但对其具体原理和应用场景并不十分了解。经过一番研究和实践,

By Ne0inhk
LazyLLM 多 Agent 应用全流程实践:从源码部署到可视化 Web 调试的低代码方案

LazyLLM 多 Agent 应用全流程实践:从源码部署到可视化 Web 调试的低代码方案

LazyLLM 多 Agent 应用全流程实践:从源码部署到可视化 Web 调试的低代码方案 前言:为什么选择 LazyLLM 构建多 Agent 大模型应用? LazyLLM 作为低代码构建多 Agent 大模型应用的开发工具,可大幅降低大模型应用的开发与部署门槛。本文聚焦其在豆包模型的落地实践,将从源码部署豆包文本模型的完整配置步骤入手,延伸至官方 WebModule 启动可视化 Web 界面的实操流程,并配套精准性、简洁度等多维度的部署测试说明,为开发者提供可直接对照的实操指南,助力高效完成豆包模型在 LazyLLM 框架下的部署与验证。 LazyLLM 整体架构解析:三层联动的多 Agent 运行体系 LazyLLM 的架构分为三层级递进结构,各层级分工明确且联动协同,实现从应用开发到落地执行的全流程覆盖:上层(LazyPlatform AI 大模型应用开发平台):核心含应用编排平台以可视化编排、发布、回流、调优的闭环完成应用构建迭代与平台管理模块通过租户、权限管理支撑多用户运维,是开发者的高效开发管理入口中层(

By Ne0inhk