我使用下面的代码来计算从早到晚实时网络摄像头中的人数
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.insert(len(people_list)+1,i)
。在insert命令的实质是:第一个参数是要在其前面插入的元素的索引。并且}。但是您正在做
people_list.insert(0, x)
插入到列表的前面,people_list.insert(len(people_list), x)
相当于{(len() + 1 , i)
。在这就是列表索引值的样子:},这类似于append。在
0 1 2 3 4 5
。这里len(arr_list)=6
。所以这里arr_list.insert(len(arr_list), x)
将在第6个索引处插入{通过改变面部数量来解决这个问题是一个很好的方法。但是-
考虑一下这个例子——一个人正好在另一个人离开框架时进入框架。现在看看名单上的数字,你不可能知道。在
另外,如果face cascade无法在一帧内检测到人脸,则会出现错误的计数。在
既然这个问题已经标记了opencv,我建议-
然后像现在一样不断更新人脸数量。它可以让你更好地统计进出的人数。但不是不同的人,因为你没有存储的脸。在
不需要名单
首先,由于没有针对人员的
IDs
,因此存储在列表中看到的人员是没有意义的,因此您应该使用一个存储int
的变量:而不是这样:
^{pr2}$您需要检查当前帧中的人数是否大于上一帧中的人数,以及是否将
people_count
递增the number of people in the current frame
-the number of people in the last frame
。所以如果最后一帧中有4
人,并且有6
这个帧,那么以2
递增。在所以,代替上面的那一行,做一些类似的事情:
假设您在代码开始时将
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)
,因为这样更简洁:)相关问题 更多 >
编程相关推荐