python - 如何在检测到的每个新对象处创建 python 列表
问题描述
我正在从事我python
opencv
所在的项目detecting
和tracking
人在框架中的运动。我正在line
从人进入框架的地方绘制一个,并在人在框架中移动的任何地方继续绘制,然后当人移出框架时最终停止。下面是代码:
centroid_dict = dict()
centroid_list = []
object_id_list = []
"""
SOME CODE
"""
objects = tracker.update(rects)
for (objectID, bbox) in objects.items():
x1, y1, x2, y2 = bbox
x1 = int(x1)
y1 = int(y1)
x2 = int(x2)
y2 = int(y2)
cX = int((x1 + x2) / 2.0)
cY = int((y1 + y2) / 2.0)
cv2.circle(frame, (cX, cY), 4, (0, 255, 0), -1)
centroid_list.append((cX, cY))
centroid_dict[objectID] = centroid_list
if objectID not in object_id_list:
# This will run only once for the first time for every objectID
start_pt = (cX, cY)
end_pt = (cX, cY)
cv2.line(frame, start_pt, end_pt, (0, 255, 0), 2)
object_id_list.append(objectID)
first_time = False
else:
l = len(centroid_list)
for pt in range(len(centroid_dict[objectID])):
if not pt + 1 == l:
start_pt = (centroid_dict[objectID][pt][0], centroid_dict[objectID][pt][1])
end_pt = (centroid_dict[objectID][pt+1][0], centroid_dict[objectID][pt+1][1])
cv2.line(frame, start_pt, end_pt, (0, 255, 0), 2)
在上面的代码中,我得到objectID
了bounding box coordinates
来自tracker.update(rects)
. 使用我正在计算的坐标cX
,cY
我稍后用它来画一条线。我将附加所有我稍后将其添加cX, cY
到 . 当跟踪此人时,这工作正常。在第一个人之后,当第二个人进来时,它会从第一个人移出框架的地方画线,主要原因是在代码中,我没有清除它一直持有第一个人的任何地方,并且和第二个人的,也是由于这条线以错误的方式绘制的。centroid_list
centroid_dict[objectID]
centroid_list
cX
cY
cX
cY
唯一的解决方案是我需要为每个objectID
. 所以说cX
和cY
不混。我无法为此找到合适的解决方案。任何人都可以在这里帮助我。谢谢
编辑
我正在推断一个测试视频文件。这里有一些图像可以更好地理解场景
在上图中,我们可以看到女士从哪里进入以及从哪里移出画面。我还在图像中标记了起点和终点。现在看看下面的图片,第二位女士进来了:
在上图中,您可以看到第二位女士刚刚进入,但对于她来说,起点仍然是第一位女士之前输入的位置,所有坐标和绘制的线都来自第一位女士的坐标。发生这种情况是因为在我们的代码中centroid_list
仍然包含第一夫人的坐标,因此它实际上开始绘制第一夫人进入的线,因此没有任何意义。希望这种情况现在很清楚。
解决方案
你不需要centroid_list
你可以使用centroid_dict
您必须在循环之前定义centroid_dict
为collections.defaultdict :for
from collections import defaultdict
centroid_dict = defaultdict(list)
在你的for
循环中:
centroid_dict[objectID].append((cX, cY))
绘制所有点只需迭代你的centroid_dict.values()
推荐阅读
- android - 带有导航组件的 DrawerLayout 不会出现在半透明状态栏后面
- python - 如何使用python正则表达式计算文本中特殊字符后出现的单词的出现次数
- php - 调用未定义的关系
- c# - UWP 代理组件重启/停止 DLL
- android - RealmPrimaryKeyConstraintException 更新领域中的对象
- r - 在R中的doubleYScale图中隐藏顶部x轴
- asp.net-core - 如何动态设置 OpenIdConnect 中间件选项的权限?
- dask - 路由到 dask worker 调试页面
- python - NoneType' 对象对于 Vectorizer sklearn 是不可迭代的
- c# - 在这个 c# 文件中,我是否只是在其自己的类中声明了一个实例?