【计算机视觉】opencv-停车位检测原理及代码演示

概述

本文介绍了一种基于OpenCV库的停车场空位检测方法。通过本项目演示,可以对opencv库有更深刻的理解。文章详细阐述了检测原理、算法流程以及代码实现。

一、原理介绍

基于OpenCV的停车位检测原理涉及多个图像处理步骤,以下将结合相关公式详细介绍每个步骤:

1. 图像预处理

a. 灰度化处理

灰度化是图像处理的第一步,它将彩色图像转换为灰度图像,减少后续处理的计算量。灰度化公式如下:

Igray(x,y)=0.299×R(x,y)+0.587×G(x,y)+0.114×B(x,y)Igray ​(x ,y )=0.299×R (x ,y )+0.587×G (x ,y )+0.114×B (x ,y)

其中,R(x,y)R (x ,y )、G(x,y)G (x ,y )和B(x,y)B (x ,y )分别是图像在点(x,y)(x ,y)处的红色、绿色和蓝色通道值。

b. 高斯模糊

高斯模糊用于减少图像噪声并平滑图像。它通过高斯核与图像卷积实现,公式如下:

Iblur(x,y)=∑i=−nn∑j=−nnw(i,j)×Igray(x+i,y+j)Iblur ​(x ,y )=i =−nnj =−nnw (i ,jIgray ​(x +i ,y +j)

其中,w(i,j)w (i ,j )是高斯分布权重,nn是核大小的一半。

2. 阈值分割

a. 自适应阈值分割

自适应阈值分割根据图像不同区域的光照条件自动调整阈值。公式如下:

Ibin(x,y)={255if Iblur(x,y)>T(x,y)0otherwiseIbin ​(x ,y )={2550​if Iblur ​(x ,y )>T (x ,y)otherwise​

其中,T(x,y)T (x ,y) 是自适应阈值,计算公式为:

T(x,y)=∑i=−kk∑j=−kkIblur(x+i,y+j)(2k+1)2−CT (x ,y )=(2k +1)2∑i =−kk ​∑j =−kkIblur ​(x +i ,y +j )​−C

这里,kk 是局部区域大小的一半,CC是常数,用于调整阈值。

3. 形态学操作

a. 中值滤波

中值滤波是一种非线性数字滤波技术,用于去除图像中的椒盐噪声。它将每个像素值替换为其邻域内的中值。

b. 膨胀操作

膨胀操作用于扩大图像中的前景区域,填充小的孔洞。公式如下:

Idilate(x,y)=max⁡(i,j)∈S(Ibin(x+i,y+j)⊗K)Idilate ​(x ,y )=(i ,j )∈S max​(Ibin ​(x +i ,y +j )⊗K)

其中,SS 是结构元素KK的邻域,⊗⊗表示膨胀操作。

4. 车位检测

车位检测基于上述处理后的二值图像。以下是检测原理:

  • 对于每个停车位的位置(x,y)(x ,y),提取相应大小的区域。
  • 计算该区域的白色像素数量(即前景像素)。
  • 如果白色像素数量低于某个阈值,则认为该车位为空。

最后,在原始视频帧上绘制矩形框来标记空车位,并可以在框内显示文本信息,如"空车位"。 通过以上步骤,OpenCV停车位检测系统能够有效地识别出停车场中的空闲车位。这些步骤结合了图像处理和计算机视觉技术,使得系统能够适应不同的光照条件和环境变化。

二、代码演示

下面是代码的详细解释

import cv2
import pickle
import cvzone
import numpy as np
  • 这些是导入语句,用于引入所需的库。

    • cv2:用于图像处理和计算机视觉。

    • pickle:用于序列化和反序列化Python对象。

    • cvzone:提供一些辅助函数,用于在图像上添加文本等。

    • numpy:用于数值计算。

      cap = cv2.VideoCapture('carPark.mp4')

  • 创建一个VideoCapture对象来读取视频文件。

    • 参数:视频文件的路径。

      with open('CarParkPos', 'rb') as f:
      posList = pickle.load(f)

  • 打开一个包含停车场位置信息的文件,并加载这些位置到posList

    • pickle.load(f):从文件中反序列化对象。

      width, height = 107, 48

  • 定义停车位矩形的宽度和高度。

    def checkParkingSpace(imgPro):
    spaceCounter = 0
    for pos in posList:
    x, y = pos
    imgCrop = imgPro[y:y + height, x:x + width]
    count = cv2.countNonZero(imgCrop)
    if count < 900:
    color = (0, 255, 0) # Green
    thickness = 5
    spaceCounter += 1
    else:
    color = (0, 0, 255) # Red
    thickness = 2
    cv2.rectangle(img, pos, (pos[0] + width, pos[1] + height), color, thickness)
    cvzone.putTextRect(img, str(count), (x, y + height - 3), scale=1, thickness=2, offset=0, colorR=color)
    cvzone.putTextRect(img, f'Free: {spaceCounter}/{len(posList)}', (100, 50), scale=3, thickness=5, offset=20, colorR=(0,200,0))

  • checkParkingSpace函数:检查每个停车位是否被占用。

    • cv2.countNonZero(imgCrop):计算图像中非零像素的数量。

点击【计算机视觉】opencv-停车位检测原理及代码演示可查看全文

相关推荐
Elastic 中国社区官方博客29 分钟前
使用 Elasticsearch 导航检索增强生成图表
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
云天徽上1 小时前
【数据可视化】全国星巴克门店可视化
人工智能·机器学习·信息可视化·数据挖掘·数据分析
大嘴吧Lucy1 小时前
大模型 | AI驱动的数据分析:利用自然语言实现数据查询到可视化呈现
人工智能·信息可视化·数据分析
AI技术控1 小时前
计算机视觉算法实战——无人机检测
算法·计算机视觉·无人机
艾思科蓝 AiScholar1 小时前
【连续多届EI稳定收录&出版级别高&高录用快检索】第五届机械设计与仿真国际学术会议(MDS 2025)
人工智能·数学建模·自然语言处理·系统架构·机器人·软件工程·拓扑学
watersink2 小时前
面试题库笔记
大数据·人工智能·机器学习
Yuleave2 小时前
PaSa:基于大语言模型的综合学术论文搜索智能体
人工智能·语言模型·自然语言处理
数字化综合解决方案提供商2 小时前
【Rate Limiting Advanced插件】赋能AI资源高效分配
大数据·人工智能
一只码代码的章鱼2 小时前
机器学习2 (笔记)(朴素贝叶斯,集成学习,KNN和matlab运用)
人工智能·机器学习
周杰伦_Jay3 小时前
简洁明了:介绍大模型的基本概念(大模型和小模型、模型分类、发展历程、泛化和微调)
人工智能·算法·机器学习·生成对抗网络·分类·数据挖掘·transformer