我使用以下代码计算从早到晚实时网络摄像头的人数
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计数。我怎样才能解决这个问题?
答案 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标记,我建议 -
然后像现在一样继续更新面部数量。它可以让您更好地计算进出人员的数量。但不是那些与众不同的人,因为你没有存放面孔。
答案 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
,就像追加一样。