实时视频统计人数

2024-10-01 13:33:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

每次检测到新面孔时,人名列表计数都会增加。然而,每一帧的人名列表计数会增加,而不是每一张新面孔。我怎么才能解决这个问题?在


Tags: 代码列表lenpeoplecv2framelistface
3条回答

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

insert命令的实质是:第一个参数是要在其前面插入的元素的索引。并且people_list.insert(0, x)插入到列表的前面,people_list.insert(len(people_list), x)相当于{}。但是您正在做(len() + 1 , i)。在

这就是列表索引值的样子:0 1 2 3 4 5。这里len(arr_list)=6。所以这里arr_list.insert(len(arr_list), x)将在第6个索引处插入{},这类似于append。在

通过改变面部数量来解决这个问题是一个很好的方法。但是-

考虑一下这个例子——一个人正好在另一个人离开框架时进入框架。现在看看名单上的数字,你不可能知道。在

另外,如果face cascade无法在一帧内检测到人脸,则会出现错误的计数。在

既然这个问题已经标记了opencv,我建议-

  • 在图像中寻找一张脸。在
  • 再也找不到那张脸了,再也找不到了。当你找不到面子的时候,你怎么知道脸是丢了?在找到并在其上添加一个面具后,跟踪脸部。跟踪有很多方法。光流,camshift可能有用。另外,看看KCF,MIL,Boosting trackers可从opencv3获得。在

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

不需要名单

首先,由于没有针对人员的IDs,因此存储在列表中看到的人员是没有意义的,因此您应该使用一个存储int的变量:

people_count = 0

而不是这样:

^{pr2}$

您需要检查当前帧中的人数是否大于上一帧中的人数,以及是否将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,这应该对您有效。。。在

然而,正如评论中提到的那样,如果你不能唯一地识别这些面孔,那么你的程序将会有一个重要的楼层。在

地板是,如果person A进入房间,people_count将增加,然后如果{}也进入,people_count将变成{}。如果person A现在离开了,它仍然留在2(就像曾经有过2人一样)。但是现在如果person A返回,它将把计数增加到3,这是错误的,因为您只看到2人。在

另外,如果你错过一张脸只有一帧,那么计数将增加,因为它将采取这个人离开和一个新的人进入房间。在

p.s作为补充说明,当添加到列表末尾时,您不应该使用.insert(len(lst), val),而应该使用.append(val),因为这样更简洁:)

相关问题 更多 >