2017-08-30 123 views
6

林从早上检测到新的面部,当计数的人数在实时网络摄像头忙到晚计数的人实时视频

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数量正在增加,而不是每个新的脸部。我怎样才能解决这个问题?

+1

用户是否包含任何唯一标识符?如果是这样,请创建一组唯一标识符而不是列表。编辑:也许值得检查标识符是否已经在集合中,并跳过它,否则你的软件将不断插入数据到集合中,每次迭代 – AK47

+0

不......他们没有一个...我必须分配它基于从早上 –

+2

访问的人数那么这听起来像你需要重新评估你的用户存储方式。您如何知道特定用户是否离开? – AK47

回答

0

无需列表...

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

people_count = 0 

,然后,而不是这样的:

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

你需要检查的人在当前帧的数量大于t他在最后一帧的人数,如果它是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_count0在你的代码的开始......

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

地板是,如果person A进入房间,people_count将递增,然后如果person B进入为好,people_count现在将2。如果person A现在离开,它仍然在2(因为已有2人)。但是现在如果person A返回,它会将计数提高到3这是错误的,因为您只看到2个人。

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

PS作为一个旁注,添加到列表的末尾时,你不应该使用.insert(len(lst), val),而应该使用.append(val),因为这是更整洁:)

0

基本上,你在做什么是people_list.insert(len(people_list)+1,i)

插入命令实质上做的是:第一个参数是要插入的元素的索引。并且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,就像追加。

0

处理人脸更改以解决问题是一个很好的黑客可能工作。但 -

考虑这种情况 - 一个人在另一个人离开框架时正好输入框架。现在看清单数量,你无法说出这一点。

此外,如果人脸级联未能在一帧中检测到人脸,那么您将有一个错误的计数。

由于问题已经OpenCV的标记,我suggest-

  • 查找图像中的脸。
  • 一旦发现脸部,再次停止考虑脸部,直到脸部丢失。当你没有找到脸时,你会如何知道脸会丢失?在找到并在其上添加面罩后跟踪该面部。有很多跟踪方法。光学流动,camshift可能工作。还可以看看KCF,MIL,可从opencv 3获得的Boosting跟踪器。

然后继续更新面数,就像现在一样。它给你一个更好的入场和离场人数。但是,由于你没有存储面孔,因此不会有明显的人数。