首页 > 解决方案 > 如何在检测到的每个新对象处创建 python 列表

问题描述

我正在从事我python opencv所在的项目detectingtracking人在框架中的运动。我正在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)

在上面的代码中,我得到objectIDbounding box coordinates来自tracker.update(rects). 使用我正在计算的坐标cXcY我稍后用它来画一条线。我将附加所有我稍后将其添加cX, cY到 . 当跟踪此人时,这工作正常。在第一个人之后,当第二个人进来时,它会从第一个人移出框架的地方画线,主要原因是在代码中,我没有清除它一直持有第一个人的任何地方,并且和第二个人的,也是由于这条线以错误的方式绘制的。centroid_listcentroid_dict[objectID]centroid_listcXcYcXcY

唯一的解决方案是我需要为每个objectID. 所以说cXcY不混。我无法为此找到合适的解决方案。任何人都可以在这里帮助我。谢谢

编辑

我正在推断一个测试视频文件。这里有一些图像可以更好地理解场景

在此处输入图像描述

在上图中,我们可以看到女士从哪里进入以及从哪里移出画面。我还在图像中标记了起点和终点。现在看看下面的图片,第二位女士进来了:

在此处输入图像描述

在上图中,您可以看到第二位女士刚刚进入,但对于她来说,起点仍然是第一位女士之前输入的位置,所有坐标和绘制的线都来自第一位女士的坐标。发生这种情况是因为在我们的代码中centroid_list仍然包含第一夫人的坐标,因此它实际上开始绘制第一夫人进入的线,因此没有任何意义。希望这种情况现在很清楚。

标签: pythonlistdictionary

解决方案


你不需要centroid_list你可以使用centroid_dict

您必须在循环之前定义centroid_dictcollections.defaultdict :for

from collections import defaultdict
centroid_dict = defaultdict(list)

在你的for循环中:

centroid_dict[objectID].append((cX, cY))

绘制所有点只需迭代你的centroid_dict.values()


推荐阅读