python-3.x - 使用 OpenCV Python 进行不同人数统计
问题描述
我有一个代码可以检测视频中的汽车并对其进行计数,但是有一个问题。如果同一辆车出现在接下来的帧中,它们会再次被计算在内。我尝试了不同的资源,但没有找到任何有效的答案。
我的代码
import cv2
backsub = cv2.bgsegm.createBackgroundSubtractorMOG()
capture = cv2.VideoCapture("C:/Users/chr04/Desktop/People and car counting/Car Counting/car video/video2.mp4")
best_id=0
i = 0
car = 0
if capture:
while True:
ret, frame = capture.read()
if ret:
fgmask = backsub.apply(frame, None, 0.01)
contours, hierarchy = cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_NONE)
try: hierarchy = hierarchy[0]
except: hierarchy = []
for contour, hier in zip(contours, hierarchy):
(x,y,w,h) = cv2.boundingRect(contour)
if w > 20 and h > 20:
best_id+=1
cv2.rectangle(frame, (x,y), (x+w,y+h), (255, 0, 0), 2)
cv2.putText(frame, str(best_id), (x,y-5), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (255, 0, 0), 2)
print(best_id)
cv2.imshow("Track", frame)
cv2.imshow("background sub", fgmask)
key = cv2.waitKey(10)
if key == ord('q'):
break
解决方案
您需要一次又一次地重置循环中的计数器变量(当您逐帧获取图像时)。这似乎是这里的问题。
我从您的代码中了解到的best_id
是您的计数器变量。因此,只需在循环内初始化此变量(在语句best_id=0
后的 while 循环内if ret
),您的代码就可以正常工作,因为您从提要接收到的每一帧都需要重置此计数器,以便它可以再次开始计数,0
如下所示。
if ret:
#initializing best_id variable
best_id = 0
fgmask = backsub.apply(frame, None, 0.01)
contours, hierarchy = cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_NONE)
推荐阅读
- javascript - 这两个javascript代码之间的区别
- python - AIO Castle Cavalry - 我的代码太慢了,有什么办法可以缩短它吗?
- php - Simplephp 和数组
- c# - 统一调整玩家行为以适应 AI
- python - 继续调用函数,直到满足条件 Python
- javascript - 持续时间超过 24 小时的 Jquery 输入掩码
- cmake - 使用 CMake,如何在 gtest_discover_tests --gtest_list_tests 调用上设置环境属性?
- c# - 无法加载文件或程序集 'System.ComponentModel.Annotations,版本 = 4.2.0.0,
- javascript - 从本地存储中获取数据(最喜欢的项目)
- azure - 在 Azure 的数据工厂中为 Postgresql(源)创建链接服务时无法连接服务器