PythonAI算法
基于 Python OpenCV 的停车场车位检测与空余计数系统
基于 Python 和 OpenCV 的停车场车位检测与空余计数系统。采用传统图像处理技术,通过亮度阈值法判断车位占用状态,无需深度学习模型。内容包括依赖安装、坐标标定方法、核心代码实现及优化建议,适合初学者入门或毕业设计参考。

基于 Python 和 OpenCV 的停车场车位检测与空余计数系统。采用传统图像处理技术,通过亮度阈值法判断车位占用状态,无需深度学习模型。内容包括依赖安装、坐标标定方法、核心代码实现及优化建议,适合初学者入门或毕业设计参考。

这是一个经典的计算机视觉项目,适合初学者入门和毕业设计。
pip install opencv-python numpy
如果你使用的是 Anaconda 或已预装环境,可跳过此步。
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
# ==================== 函数定义 ====================
def get_parking_status(frame, space_coords):
"""判断一个车位是否被占用
方法:计算车位区域内像素的平均亮度变化(简单有效)
如果当前帧比背景暗很多 → 认为有车
"""
x1, y1, x2, y2 = space_coords
roi = frame[y1:y2, x1:x2] # 截取车位区域
if roi.size == 0:
return False # 防止越界
# 转换为灰度图并计算平均亮度
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
def draw_parking_info(frame, spaces, labels, statuses):
"""在画面上绘制车位框、编号、状态"""
free_count = 0
for i, (space, label, status) in enumerate(zip(spaces, labels, statuses)):
x1, y1, x2, y2 = space
color = COLOR_OCCUPIED if status else COLOR_FREE
if not 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
# ==================== 主程序 ====================
def main():
print("🚗 启动停车场车位检测系统...")
print("📌 提示:首次运行请先用图片标定好 PARKING_SPACES 坐标!")
# 打开视频源
cap = cv2.VideoCapture(VIDEO_SOURCE)
if not cap.isOpened():
print("❌ 无法打开视频源,请检查路径或摄像头连接!")
return
# 创建窗口
cv2.namedWindow("Parking Detector", cv2.WINDOW_NORMAL)
while True:
ret, frame = cap.read()
if not 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 中的坐标。
创建一个辅助脚本 get_coordinates.py:
import cv2
def click_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 列表中即可。
cv2.createBackgroundSubtractorMOG2() 自动适应光照变化。你可以围绕以下内容写报告:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online