本文介绍了一种基于OpenCV库的停车场空位检测方法。通过本项目演示,可以对opencv库有更深刻的理解。文章详细阐述了检测原理、算法流程以及代码实现。
基于OpenCV的停车位检测原理涉及多个图像处理步骤,以下将结合相关公式详细介绍每个步骤:
1. 图像预处理
a. 灰度化处理
灰度化是图像处理的第一步,它将彩色图像转换为灰度图像,减少后续处理的计算量。灰度化公式如下:
b. 高斯模糊
高斯模糊用于减少图像噪声并平滑图像。它通过高斯核与图像卷积实现,公式如下:
2. 阈值分割
a. 自适应阈值分割
自适应阈值分割根据图像不同区域的光照条件自动调整阈值。公式如下:
3. 形态学操作
a. 中值滤波
中值滤波是一种非线性数字滤波技术,用于去除图像中的椒盐噪声。它将每个像素值替换为其邻域内的中值。
b. 膨胀操作
膨胀操作用于扩大图像中的前景区域,填充小的孔洞。公式如下:
4. 车位检测
车位检测基于上述处理后的二值图像。以下是检测原理:
•对于每个停车位的位置(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):
从文件中反序列化对象。
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):
计算图像中非零像素的数量。
‣参数:
imgCrop
是停车位区域的图像。
⁍cv2.rectangle:
在图像上绘制矩形。
‣参数:
img
是目标图像,
pos
是矩形的起始点,
(pos[0] + width, pos[1] + height)
是矩形的结束点,
color
是矩形的颜色,
thickness
是矩形的线宽。
⁍cvzone.putTextRect:
在图像上添加文本。
‣参数:
img
是目标图像,
str(count)
是要添加的文本,
(x, y + height - 3)
是文本的位置,
scale
是文本大小,
thickness
是文本线宽,
offset
是偏移量,
colorR
是文本颜色。
while True:
if cap.get(cv2.CAP_PROP_POS_FRAMES) == cap.get(cv2.CAP_PROP_FRAME_COUNT):
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
success, img = cap.read()
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray, (3, 3), 1)
imgThreshold = cv2.adaptiveThreshold(imgBlur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 25, 16)
imgMedian = cv2.medianBlur(imgThreshold, 5)
kernel = np.ones((3, 3), np.uint8)
imgDilate = cv2.dilate(imgMedian, kernel, iterations=1)
checkParkingSpace(imgDilate)