我使用以下代码计算从早到晚实时网络摄像头中的人数
people_list = []
while True:
_, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(gray, 1.3, 5)
detections = faceCascade.detectMultiScale(gray, 1.15, 5)
for i in range(len(detections)):
face_i = detections[i]
x, y, w, h = face_i
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 222, 0), 1)
font = cv2.FONT_HERSHEY_SIMPLEX
people_list.insert(len(people_list)+1,i)
cv2.putText(frame, "id: "+str ( people_list[i]), (x, y), font, 2, (255, 255, 255), 2, cv2.LINE_AA)
# Display the resulting frame
cv2.imshow('Video', frame)
每当检测到一张新面孔时,people_list 计数就会增加。但是,people_list 计数是针对每一帧而不是每张新面孔而增加的。我怎样才能解决这个问题?
最佳答案
不需要列表...
首先,由于您没有人物的 ID
,因此将看到的人物存储在列表中是没有意义的,因此您应该只使用一个存储 int
的变量:
people_count = 0
然后代替这个:
people_list.insert(len(people_list)+1,i)
您需要检查当前帧中的人数是否大于上一帧中的人数,如果是则将 people_count
增加 人数在当前帧中
- 上一帧中的人数
。因此,如果上一帧有 4
人,而这一帧有 6
,则递增 2
。
所以代替上面的行,做类似的事情:
if len(detections) > last_count:
people_count += len(detections - last_count)
last_count = len(detection)
假设您在代码开头将 last_count
声明为 0
,这应该对您有用...
不过话虽如此,如评论中所述,如果您不能唯一识别人脸,那么您的程序将有一个重要的地板。
如果 人 A
进入房间,people_count
将增加,然后如果 人 B
也进入, people_count
现在将为 2
。如果 人 A
现在离开,它会保持在 2
(因为已经有 2
人)。但是现在,如果 person A
返回,它会将计数增加到 3
,这是错误的,因为您只看到了 2
人。
此外,如果您只在一帧中错过了一张脸,那么计数将会增加,因为它会在那个人离开并且一个新人进入房间时进行计算。
p.s 作为旁注,当添加到列表末尾时,你不应该使用 .insert(len(lst), val)
,而应该使用 .append(val)
因为这样更简洁:)
关于python - 在实时视频中统计人数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45956632/