在实时视频中统计人数

Count people in realtime video

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

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 计数是针对每一帧而不是每个新面孔而增加的。我怎样才能解决这个问题?

不需要列表...

首先,因为你没有 IDs 的人,存储在列表中看到的人是没有意义的,所以你应该只使用一个变量存储 int:

people_count = 0

然后代替这个:

people_list.insert(len(people_list)+1,i)

您需要检查当前帧中的人数是否大于上一帧中的人数,如果是则将 people_count 增加 the number of people in the current frame - the number of people in the last frame。因此,如果上一帧有 4 人,而这一帧有 6 人,则递增 2

因此,不要执行上面的行,而是执行以下操作:

if len(detections) > last_count:
   people_count += len(detections - last_count)

last_count = len(detection)

假设您在代码开头将 last_count 声明为 0,这应该对您有用...

不过话说回来,评论里也说了,如果你不能唯一识别人脸,那么你的程序就会有很大的floor。

地板是如果person A进入房间,people_count会增加然后如果person B也进入,people_count现在会2.如果 person A 现在离开,它会留在 2(因为已经有 2 人)。但是现在如果 person A returns,它会将计数增加到 3 这是错误的,因为你只看到 2 人。

此外,如果您只在一帧中错过了一张脸,那么计数将会增加,因为它会在那个人离开并且一个新人进入房间时进行计数。

p.s 作为旁注,添加到列表末尾时,不应使用 .insert(len(lst), val),而应使用 .append(val)更整洁:)

基本上,您正在做的是 people_list.insert(len(people_list)+1,i) .

insert 命令的主要作用是:第一个参数是要插入的元素的索引。而people_list.insert(0, x)插入到列表的最前面,people_list.insert(len(people_list), x)等价于a.append(x)。但是你正在做 (len() + 1 , i).

这是列表 index 值的样子:0 1 2 3 4 5。这里 len(arr_list)=6 。所以这里 arr_list.insert(len(arr_list), x) 会在第 6 个索引处插入 i,就像 append.

通过改变面数来解决问题是一个可能会奏效的绝招。但是-

考虑这种情况——一个人恰好在另一个人离开画面时进入画面。现在查看列表计数,您无法判断。

此外,如果人脸级联在一帧中未能检测到人脸,那么您的计数就会出错。

既然问题有opencv标签,我建议-

  • 在图片中寻找人脸。
  • 一旦找到一张脸,就不再考虑那张脸,直到它丢失为止。当你找不到面子时,你怎么知道面子丢了?找到并在上面添加面具后跟踪脸部。追踪的方式有很多种。光流,camshift 可能工作。另请查看 opencv 3 提供的 KCF、MIL、Boosting 跟踪器。

然后像现在一样不断更新面数。它可以让您更好地统计进出人数。但不同的人不算数,因为您没有存储面孔。