所以我正在计划我想要在视频中计算车辆和行人的方法。以下是我想采取的方法的基本步骤。
- 使用背景减法来区分移动的物体。
- cv2使用。SimpleBlobDetector从BGS步骤生成的掩码中检测blob,并返回关键点。
- 使用给定的关键点执行所有blob(在示例中尚未实现)的跟踪。
问题:这种方法是否适用于行人和车辆,如果是这样,我不清楚如何区分不同的blobs?
我想知道是否可能是blob的大小可以用来区分行人(小blob)和车辆(大blob)。然而,我不确定如何处理车辆远离源头,因此看起来很小的情况。
import numpy as np
import cv2
cap = cv2.VideoCapture('video.avi')
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
fgbg = cv2.BackgroundSubtractorMOG(500, 6, 0.9, 1)
# Setup SimpleBlobDetector parameters.
params = cv2.SimpleBlobDetector_Params()
# Change thresholds
params.minThreshold = 10;
params.maxThreshold = 200;
# Filter by Area.
params.filterByArea = True
params.minArea = 400
# Filter by Circularity
params.filterByCircularity = True
params.minCircularity = 0.1
# Filter by Convexity
params.filterByConvexity = True
params.minConvexity = 0.87
# Filter by Inertia
params.filterByInertia = True
params.minInertiaRatio = 0.01
# Create a detector with the parameters
ver = (cv2.__version__).split('.')
if int(ver[0]) < 3 :
detector = cv2.SimpleBlobDetector(params)
else :
detector = cv2.SimpleBlobDetector_create(params)
while(1):
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
#fgmask = frame;
# Detect blobs.
keypoints = detector.detect(fgmask)
# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob
im_with_keypoints = cv2.drawKeypoints(frame, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
print keypoints
cv2.imshow('frame',im_with_keypoints)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
我建议不要用斑点区域法作为区分行人和车辆的方法。一个明显的缺点你已经解释过了——更远的汽车肯定会被当作行人。
在步骤2和步骤3之间有必要涉及更复杂的逻辑,例如:
- 基于HOG的
- 人物检测器-参见http://lear.inrialpes.fr/people/triggs/pubs/Dalal-cvpr05.pd。已在OpenCV中实现,经验证明在人员检测中具有良好的准确性。
- 汽车检测器/汽车特征检测器(车轮,车牌号码等)基于Haar分类器-需要准备自己的工具与opencv提供。拥有一个好的分类器来检测某些汽车特征,您将通过增加检测到的汽车阳性数量来提高整体检测的准确性。
在你的最终解决方案中至少有一个要点对我来说是一个好的精度解决方案的必要条件。同时使用它们甚至可以获得更好的准确性。