You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改CentroidTracker使其update方法返回带ID与检测框的OrderedDict

修改实现方案

核心逻辑为不改动原有的中心点匹配跟踪逻辑,新增检测框存储、更新、返回的逻辑即可,具体修改步骤如下:

  1. 修改类初始化方法,新增字典存储检测框
def __init__(self, maxDisappeared=50):
    self.nextObjectID = 0
    self.objects = OrderedDict() # 保留原有存中心点的逻辑,不影响跟踪匹配
    self.bounding_boxes = OrderedDict() # 新增:存储每个ID对应的原始检测框
    self.disappeared = OrderedDict()
    self.maxDisappeared = maxDisappeared
  1. 修改注册方法,同时存储中心点和检测框
def register(self, centroid, rect):
    self.objects[self.nextObjectID] = centroid
    self.bounding_boxes[self.nextObjectID] = rect # 新增:存储对应检测框
    self.disappeared[self.nextObjectID] = 0
    self.nextObjectID += 1
  1. 修改注销方法,同步删除检测框记录
def deregister(self, objectID):
    del self.objects[objectID]
    del self.bounding_boxes[objectID] # 新增:同步删除检测框记录
    del self.disappeared[objectID]
  1. 适配注册调用的入参
  • 首次跟踪注册新目标时,传入对应检测框:
if len(self.objects) == 0:
    for i in range(0, len(inputCentroids)):
        self.register(inputCentroids[i], rects[i]) # 新增传入对应检测框
  • 后续帧新增目标注册时,传入对应检测框:
else:
    for col in unusedCols:
        self.register(inputCentroids[col], rects[col]) # 新增传入对应检测框
  1. 匹配到已有目标时同步更新检测框
objectID = objectIDs[row]
self.objects[objectID] = inputCentroids[col]
self.bounding_boxes[objectID] = rects[col] # 新增:更新对应ID的检测框
self.disappeared[objectID] = 0
  1. 修改返回值为检测框字典
    将update方法末尾的return self.objects修改为:
return self.bounding_boxes
  1. 适配你返回的坐标顺序
    你的检测函数返回的是[ymin, xmin, ymax, xmax],需要修改中心点计算的遍历逻辑适配坐标顺序:
# 原代码的遍历逻辑改为如下
for (i, (ymin, xmin, ymax, xmax)) in enumerate(rects):
    cX = int((xmin + xmax) / 2.0)
    cY = int((ymin + ymax) / 2.0)
    inputCentroids[i] = (cX, cY)

完成以上修改后,调用ct.update(detected)就会直接返回你需要的ID对应原始检测框的OrderedDict,原有跟踪匹配逻辑完全保留,不会影响跟踪效果。

内容的提问来源于stack exchange,提问作者e-Learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:21:01