项目背景与意义(智慧停车、城市交通管理) 基于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

Flutter 三方库 dloader 的鸿蒙化适配指南 - 掌握极简且高性能的文件离线技术、助力鸿蒙应用构建稳健的后台下载与资源调度系统

Flutter 三方库 dloader 的鸿蒙化适配指南 - 掌握极简且高性能的文件离线技术、助力鸿蒙应用构建稳健的后台下载与资源调度系统

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 dloader 的鸿蒙化适配指南 - 掌握极简且高性能的文件离线技术、助力鸿蒙应用构建稳健的后台下载与资源调度系统 前言 在 OpenHarmony 鸿蒙应用向大容量、多资源协同(如:大型游戏素材更新、离线地图包下载、企业级加密文档分发)进化的过程中,单纯的 HttpClient 请求已无法满足用户对“进度可见性”、“后台持续性”以及“异常自愈”的渴望。dloader 作为一个专为 Dart 设计的流式下载组件,旨在通过一套极为精简的 DSL(领域特定语言),将复杂的多线程分片、百分比计算及缓存校验逻辑封装在黑盒之中。本文将探讨如何在鸿蒙端利用 dloader 打造“丝滑且可信”的资源获取体验。 一、原原理分析 / 概念介绍 1.1 基础原理

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 dart_appwrite 将鸿蒙应用极速接入强大的开源后端即服务(BaaS 最佳实践)

Flutter for OpenHarmony: Flutter 三方库 dart_appwrite 将鸿蒙应用极速接入强大的开源后端即服务(BaaS 最佳实践)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 应用开发时,后端基础设施往往是中小型开发者或初创团队的拦路虎。购买服务器、部署数据库、集成 OAuth 登录、管理文件云存储……这一系列工作不仅耗时,还容易在安全性上出现漏洞。 dart_appwrite 是连接 OpenHarmony 应用与 Appwrite(类似于 Firebase 的开源替代品)的官方桥梁。它为鸿蒙开发者提供了全套的后端 API,让你在短短几分钟内就能为鸿蒙应用增加账号系统、实时数据库和云存储功能,彻底实现“一人完成全栈开发”。 一、鸿蒙-Appwrite 云端架构图 该库作为桥梁,将鸿蒙设备的请求安全分发到后端各个功能模块。 鸿蒙 App (Dart SDK) Appwrite Client Account (身份验证) Databases (文档型数据库) Storage

By Ne0inhk
使用LLaMA-Factory的数据集制作流程与训练微调Qwen3及评估

使用LLaMA-Factory的数据集制作流程与训练微调Qwen3及评估

文章目录 * 1 LLaMA-Factory环境安装 * 2 数据集制作 * 3 模型下载 * 4 使用命令进行训练 而非webui * 训练命令 * 导出模型命令 * 5 训练后的Qwen3模型评估 * 6 训练后的Qwen3模型进行测试 AutoDL中的LLaMA-Factory 使用 训练微调 llame3数据集 cmmlu 使用LLaMA-Factory微调训练Qwen2-VL-7B/Qwen2.5-VL-7B与视觉大模型数据集制作流程与训练评估 b站:https://www.bilibili.com/video/BV1KceNzoE87/ 本文介绍了使用LLaMA-Factory框架微调Qwen3-4B-Instruct-2507模型的完整流程。内容包括:1) 环境安装与WebUI配置;2) 数据集制作与格式要求;3) 通过ModelScope下载Qwen3模型;4) 使用命令行进行LoRA微调训练,展示了训练参数与GPU使用情况;5) 模型导出方法;6) 最后对微调后的模型进行评估。整个过程在6块GPU上约15分钟完成训练,并提供了训练

By Ne0inhk

一键部署:用OpenAI API格式调用20+主流大模型(ChatGLM/文心一言/通义千问等)

一键部署:用OpenAI API格式调用20+主流大模型(ChatGLM/文心一言/通义千问等) 1. 为什么你需要一个统一的API入口 你是不是也遇到过这些情况: * 想在本地部署一个AI助手,却发现每个大模型都有自己的API格式——ChatGLM要填/chat路径,文心一言要走/v2.1/bce/wenxinworkshop/ai/generate,通义千问又是一套完全不同的参数结构; * 项目里已经写好了OpenAI调用逻辑,现在想换成国产模型,结果要重写所有请求封装、错误处理、流式响应解析; * 同时测试多个模型效果,却要在代码里反复切换不同SDK、不同认证方式、不同超时配置; * 更头疼的是,有些模型需要代理、有些要翻墙、有些必须用HTTPS、有些对请求头敏感——光是环境适配就耗掉半天。 这些问题,其实都指向同一个核心痛点:模型太多,接口太碎,开发太累。 而今天要介绍的这个镜像,就是为了解决这个问题而生的——它不训练模型,不优化性能,不做任何推理计算。它只做一件事:把20多个主流大模型,全部“

By Ne0inhk