如何修改CentroidTracker使其update方法返回带ID与检测框的OrderedDict
修改实现方案
核心逻辑为不改动原有的中心点匹配跟踪逻辑,新增检测框存储、更新、返回的逻辑即可,具体修改步骤如下:
- 修改类初始化方法,新增字典存储检测框
def __init__(self, maxDisappeared=50): self.nextObjectID = 0 self.objects = OrderedDict() # 保留原有存中心点的逻辑,不影响跟踪匹配 self.bounding_boxes = OrderedDict() # 新增:存储每个ID对应的原始检测框 self.disappeared = OrderedDict() self.maxDisappeared = maxDisappeared
- 修改注册方法,同时存储中心点和检测框
def register(self, centroid, rect): self.objects[self.nextObjectID] = centroid self.bounding_boxes[self.nextObjectID] = rect # 新增:存储对应检测框 self.disappeared[self.nextObjectID] = 0 self.nextObjectID += 1
- 修改注销方法,同步删除检测框记录
def deregister(self, objectID): del self.objects[objectID] del self.bounding_boxes[objectID] # 新增:同步删除检测框记录 del self.disappeared[objectID]
- 适配注册调用的入参
- 首次跟踪注册新目标时,传入对应检测框:
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]) # 新增传入对应检测框
- 匹配到已有目标时同步更新检测框
objectID = objectIDs[row] self.objects[objectID] = inputCentroids[col] self.bounding_boxes[objectID] = rects[col] # 新增:更新对应ID的检测框 self.disappeared[objectID] = 0
- 修改返回值为检测框字典
将update方法末尾的return self.objects修改为:
return self.bounding_boxes
- 适配你返回的坐标顺序
你的检测函数返回的是[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
相关产品推荐
相关产品推荐

