在实时视频中统计人数
Count people in realtime video
我使用以下代码统计从早到晚实时网络摄像头中的人数
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 计数是针对每一帧而不是每个新面孔而增加的。我怎样才能解决这个问题?
不需要列表...
首先,因为你没有 IDs
的人,存储在列表中看到的人是没有意义的,所以你应该只使用一个变量存储 int
:
people_count = 0
然后代替这个:
people_list.insert(len(people_list)+1,i)
您需要检查当前帧中的人数是否大于上一帧中的人数,如果是则将 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
,这应该对您有用...
不过话说回来,评论里也说了,如果你不能唯一识别人脸,那么你的程序就会有很大的floor。
地板是如果person A
进入房间,people_count
会增加然后如果person B
也进入,people_count
现在会2
.如果 person A
现在离开,它会留在 2
(因为已经有 2
人)。但是现在如果 person A
returns,它会将计数增加到 3
这是错误的,因为你只看到 2
人。
此外,如果您只在一帧中错过了一张脸,那么计数将会增加,因为它会在那个人离开并且一个新人进入房间时进行计数。
p.s 作为旁注,添加到列表末尾时,不应使用 .insert(len(lst), val)
,而应使用 .append(val)
更整洁:)
基本上,您正在做的是 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)
.
这是列表 index 值的样子:0 1 2 3 4 5
。这里 len(arr_list)=6
。所以这里 arr_list.insert(len(arr_list), x)
会在第 6 个索引处插入 i
,就像 append.
通过改变面数来解决问题是一个可能会奏效的绝招。但是-
考虑这种情况——一个人恰好在另一个人离开画面时进入画面。现在查看列表计数,您无法判断。
此外,如果人脸级联在一帧中未能检测到人脸,那么您的计数就会出错。
既然问题有opencv标签,我建议-
- 在图片中寻找人脸。
- 一旦找到一张脸,就不再考虑那张脸,直到它丢失为止。当你找不到面子时,你怎么知道面子丢了?找到并在上面添加面具后跟踪脸部。追踪的方式有很多种。光流,camshift 可能工作。另请查看 opencv 3 提供的 KCF、MIL、Boosting 跟踪器。
然后像现在一样不断更新面数。它可以让您更好地统计进出人数。但不同的人不算数,因为您没有存储面孔。
我使用以下代码统计从早到晚实时网络摄像头中的人数
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 计数是针对每一帧而不是每个新面孔而增加的。我怎样才能解决这个问题?
不需要列表...
首先,因为你没有 IDs
的人,存储在列表中看到的人是没有意义的,所以你应该只使用一个变量存储 int
:
people_count = 0
然后代替这个:
people_list.insert(len(people_list)+1,i)
您需要检查当前帧中的人数是否大于上一帧中的人数,如果是则将 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
,这应该对您有用...
不过话说回来,评论里也说了,如果你不能唯一识别人脸,那么你的程序就会有很大的floor。
地板是如果person A
进入房间,people_count
会增加然后如果person B
也进入,people_count
现在会2
.如果 person A
现在离开,它会留在 2
(因为已经有 2
人)。但是现在如果 person A
returns,它会将计数增加到 3
这是错误的,因为你只看到 2
人。
此外,如果您只在一帧中错过了一张脸,那么计数将会增加,因为它会在那个人离开并且一个新人进入房间时进行计数。
p.s 作为旁注,添加到列表末尾时,不应使用 .insert(len(lst), val)
,而应使用 .append(val)
更整洁:)
基本上,您正在做的是 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)
.
这是列表 index 值的样子:0 1 2 3 4 5
。这里 len(arr_list)=6
。所以这里 arr_list.insert(len(arr_list), x)
会在第 6 个索引处插入 i
,就像 append.
通过改变面数来解决问题是一个可能会奏效的绝招。但是-
考虑这种情况——一个人恰好在另一个人离开画面时进入画面。现在查看列表计数,您无法判断。
此外,如果人脸级联在一帧中未能检测到人脸,那么您的计数就会出错。
既然问题有opencv标签,我建议-
- 在图片中寻找人脸。
- 一旦找到一张脸,就不再考虑那张脸,直到它丢失为止。当你找不到面子时,你怎么知道面子丢了?找到并在上面添加面具后跟踪脸部。追踪的方式有很多种。光流,camshift 可能工作。另请查看 opencv 3 提供的 KCF、MIL、Boosting 跟踪器。
然后像现在一样不断更新面数。它可以让您更好地统计进出人数。但不同的人不算数,因为您没有存储面孔。