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

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

1

1

- ✅ 实时视频流/图片输入
- ✅ 车位区域框选与编号标注
- ✅ 车辆占用状态识别(红框= occupied, 绿框= free)
- ✅ 空余车位计数显示(FREE: 1)
- ✅ 可视化界面输出
这是一个非常经典且实用的计算机视觉项目,适合初学者入门和毕业设计。
🚗 完整可运行代码(含超详细注释)
以下代码基于 opencv-python 和 numpy,无需深度学习模型,纯传统图像处理实现,小白也能看懂!
📁 文件结构建议:
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” → 当前空余车位总数
🎯 进阶优化建议(可选)
- 动态背景建模:使用
cv2.createBackgroundSubtractorMOG2()自动适应光照变化。 - 多尺度支持:自动缩放坐标适配不同分辨率视频。
- 数据库存储:将每次检测结果存入 MySQL,生成历史报表。
- Web 界面:用 Flask + Vue 做成网页版监控系统。
- 深度学习替代:改用 YOLOv8 检测车辆,精度更高(但需要训练)。
📄 报告撰写要点(供参考)
你可以围绕以下内容写报告:
- 项目背景与意义(智慧停车、城市交通管理)
- 技术选型理由(为什么用 OpenCV 而不是深度学习?)
- 核心算法原理(亮度阈值法、ROI 提取)
- 实验过程(如何标定坐标、测试不同场景)
- 结果分析(准确率、局限性、改进方向)
- 未来展望(接入 IoT、移动端推送等)
✅ 总结
- ✔️ 基于 Python + OpenCV
- ✔️ 包含完整代码 + 超级详细注释
- ✔️ 小白也能看懂和修改
- ✔️ 直接可跑(只要配置好坐标)
- ✔️ 可扩展性强,适合做毕业设计或课程设计
🎉