在实时视频中统计人数

时间:2017-08-30 09:23:29

标签: 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计数。我怎样才能解决这个问题?

3 个答案:

答案 0 :(得分:1)

无需列表...

首先,由于人们没有IDs,因此存储列表中的人员毫无意义,因此您应该只使用存储int的变量:

people_count = 0

然后代替:

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

您需要检查当前帧中的人数是否大于最后一帧中的人数,如果是,则people_count增加the number of people in the current frame - {{1} }。因此,如果最后一帧有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进入会议室,person A将会增加,然后people_count也会进入,person B现在将people_count。如果2现在离开,则会保留person A(因为有2个人)。但现在,如果2返回,则会将计数提高到person A,这是错误的,因为您只看到3个人。

此外,如果你只丢了一帧的脸,那么计数会增加,因为当这个人离开并且有一个新人进入房间时,它将会增加。

ps作为旁注,当添加到列表末尾时,您不应该使用2,而应该使用.insert(len(lst), val),因为这更加整洁:)< / em>的

答案 1 :(得分:1)

处理面数改变以解决问题是一个很好的黑客可能会有效。但 -

考虑这种情况 - 当另一个人离开框架时,一个人准确地进入框架。现在查看列表计数,你无法分辨出来。

此外,如果面部级联无法在一帧中检测到面部,那么您将有错误的计数。

由于问题有opencv标记,我建议 -

  • 在图像中查找脸部。
  • 一旦发现一张脸,请再次停止考虑该脸,直到它丢失为止。当你没有找到面部时,你怎么知道面部会丢失?找到并在其上添加面具后跟踪面部。跟踪有很多种方法。光流,camshift可能会工作。另请参阅opencv 3提供的KCF,MIL,Boosting跟踪器。

然后像现在一样继续更新面部数量。它可以让您更好地计算进出人员的数量。但不是那些与众不同的人,因为你没有存放面孔。

答案 2 :(得分:0)

基本上,你正在做的是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)

列表索引的值如下所示:0 1 2 3 4 5。这里len(arr_list)=6。所以这里arr_list.insert(len(arr_list), x)会在第6个索引处插入i,就像追加一样。