2017-08-30 130 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跟蹤器。

然後繼續更新面數,就像現在一樣。它給你一個更好的入場和離場人數。但是,由於你沒有存儲面孔,因此不會有明顯的人數。