python - 在实时视频中统计人数

标签 python opencv webcam face-detection

我使用以下代码计算从早到晚实时网络摄像头中的人数

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/

相关文章:

python - 从图像中删除红色文本

python - 使用python和opencv进行视频分析 : Input video is upside down

objective-c - 以编程方式访问 iSight?

google-chrome - chrome 不支持 getUserMedia()

Python 请求 Get(URL) 200 响应,无数据

python - 获取 Pygame 键盘输入并检查它是否为数字

python - 如果cardNumberArray [0] == 4 : IndexError: list index out of range

python - OpenCV Python 车牌检测

python - opencv python - 从rodrigues函数应用旋转矩阵

java - 创建文件后是否可以自动上传到网络服务器?