在零售商店内外进行人流统计是一项多用途的应用,它可以帮助监测停留时间、调整人员配置、管理排队等。本文将讨论流行的人流统计方法以及一些视频处理任务,以获得更好的结果。使用的一些算法包括Haar Cascade、HOG和OpenCV方法,用于人员检测。在了解这些方法及其优势后,可以将这些方法应用于人流统计用例,如下所述。
目标是利用CCTV录像,找出特定小时内商店内的人数(停留时间)以及零售商店内各个部分(如杂货、饮料等)的人数。为此任务,需要在商店入口点和商店内不同部分的CCTV视频。下面视频展示了一个典型的零售商店CCTV录像,视野中包含商店的各个部分。
让讨论一些人员检测算法以及在本文中使用的方法:
这是一种基于机器学习的算法,通过大量正负图像训练一个级联函数。在检测中使用预训练的级联。了解更多关于这种方法的信息,请访问。以下是代码示例:
import numpy as np
import cv2
# 创建人体分类器
body_classifier = cv2.CascadeClassifier('haarcascade_fullbody.xml')
# 为视频文件初始化视频捕获
cap = cv2.VideoCapture('moskva.mov')
# 循环一旦视频成功加载
while cap.isOpened():
# 读取第一帧
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 将帧传递给人体分类器
bodies = body_classifier.detectMultiScale(gray, 1.1, 3)
# 提取任何识别出的人体的边界框
for (x,y,w,h) in bodies:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 255), 2)
cv2.imshow('Pedestrians', frame)
if cv2.waitKey(1) == 13: #13是Enter键
break
cap.release()
cv2.destroyAllWindows()
HOG(梯度直方图)是一种“特征描述符”。该技术统计图像(以及视频中)局部部分的梯度方向出现次数。了解更多关于这种方法的信息,请访问。以下是代码示例:
import cv2
import imutils
# 初始化HOG人员检测器
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
# 读取图像
image = cv2.imread('img.png')
# 调整图像大小
image = imutils.resize(image, width=min(400, image.shape[1]))
# 检测图像中所有包含行人的区域
(regions, _) = hog.detectMultiScale(image, winStride=(4, 4), padding=(4, 4), scale=1.05)
# 在图像中绘制区域
for (x, y, w, h) in regions:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 显示输出图像
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
背景减除是许多基于视觉的应用中的主要预处理步骤。例如,在访客计数器的情况下,静态相机用于计算进入或离开房间的访客数量,或者交通摄像机提取有关车辆的信息等。在所有这些情况下,首先需要单独提取人员或车辆。从技术上讲,需要从静态背景中提取移动的前景。这是实时人员检测的相对快速方法。OpenCV实现了这样的三种算法:
BackgroundSubtractorMOG、BackgroundSubtractorMOG2、BackgroundSubtractorGMG。了解更多关于这些算法的信息,请访问。以下是使用BackgroundSubtractorMOG2的OpenCV背景减除的实现代码:
import numpy as np
import cv2
cap = cv2.VideoCapture('vtest.avi')
fgbg = cv2.createBackgroundSubtractorMOG2()
while(1):
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
cv2.imshow('frame',fgmask)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
HOG检测器的准确性(在简单HOG检测方法中讨论)可以通过使用SVM分类器来进一步提高,以从样本图像中分类正负特征。从收集的正负图像样本中提取的正负特征用于训练带有HOG检测的SVM模型。这种方法以最大准确性计算交通流量,并且算法可以定制。为任何新商店生成负图像(零售商店的背景图像)可以提高准确性。
比较上述算法:基于上述观察,考虑到从零售商店获得的不同类型视频,让看看本文使用的方法:
为了有效地在单个摄像机视图中对各个类别进行流量计数,需要对商店布局视频进行分割。一个录像可能覆盖2-3个类别,如饮料、杂货部分。为了获得商店不同部分的准确人员计数,分割是有帮助的。
如上图所示,CCTV视频在海湾级别可用,因此为了测量类别级别的流量,视频覆盖区域按类别分割。