专栏名称: 新机器视觉
最前沿的机器视觉与计算机视觉技术
目录
相关文章推荐
科幻世界SFW  ·  悼念向际纯:中国科幻绘画的开拓者 ·  2 天前  
科幻世界SFW  ·  新刊速递 | ... ·  5 天前  
51好读  ›  专栏  ›  新机器视觉

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

新机器视觉  · 公众号  ·  · 2024-12-23 11:34

正文

概述


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




一、原理介绍


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


1. 图像预处理


a. 灰度化处理

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



b. 高斯模糊

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



2. 阈值分割


a. 自适应阈值分割

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



3. 形态学操作


a. 中值滤波

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


b. 膨胀操作

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



4. 车位检测


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


•对于每个停车位的位置(x, y),提取相应大小的区域。

•计算该区域的白色像素数量(即前景像素)。

•如果白色像素数量低于某个阈值,则认为该车位为空。


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



二、代码演示


下面是代码的详细解释


import cv2import pickleimport cvzoneimport 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): 计算图像中非零像素的数量。

‣参数: 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)






请到「今天看啥」查看全文