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

ANSYS平板plunging涡旋仿真视频跟踪保留原始ID问题咨询

问题描述

基于ANSYS仿真平板plunging产生的涡旋数据生成的可视化视频中,涡旋(也叫blob块)存在持续的分裂、融合形态变化。

目标

对涡旋进行识别并标注,保证标签一致性:

  • 若某涡旋在上一帧已分配标签,后续帧标签保持不变
  • 涡旋分裂时,体积更大的母涡旋保留原有标签,更小的子涡旋分配新标签
  • 涡旋融合时,融合后的涡旋继承体积更大的那个涡旋的标签

已完成尝试

编写了基于轮廓检测的识别逻辑:先检测目标边界得到轮廓,计算轮廓质心,再通过下一帧轮廓质心与上一帧的欧氏距离匹配,距离小于阈值则判定为同一目标。

跟踪算法核心代码

import math

class EuclideanDistTracker:
    def __init__(self):
        # 存储目标的质心位置
        self.center_points = {}
        # 统计ID计数,每检测到新目标计数+1
        self.id_count = 0


    def update(self, objects_rect):
        objects_bbs_ids = []

        # 计算新目标的质心
        for rect in objects_rect:
            x, y, w, h = rect
            cx = (x + x + w) // 2
            cy = (y + y + h) // 2

            # 判断目标是否已被检测过
            same_object_detected = False
            for id, pt in self.center_points.items():
                dist = math.hypot(cx - pt[0], cy - pt[1])

                if dist < 20: # 距离阈值
                    self.center_points[id] = (cx, cy)
                    print(self.center_points)
                    objects_bbs_ids.append([x, y, w, h, id])
                    same_object_detected = True
                    break

            # 检测到新目标,分配新ID
            if same_object_detected is False:
                self.center_points[self.id_count] = (cx, cy)
                objects_bbs_ids.append([x, y, w, h, self.id_count])
                self.id_count += 1

        # 清理字典,移除不再出现的ID
        new_center_points = {}
        for obj_bb_id in objects_bbs_ids:
            _, _, _, _, object_id = obj_bb_id
            center = self.center_points[object_id]
            new_center_points[object_id] = center

        self.center_points = new_center_points.copy()
        return objects_bbs_ids

视频流实现代码

import cv2
import numpy as np
from tracker import *

# 初始化跟踪器
tracker = EuclideanDistTracker()

cap = cv2.VideoCapture("Video Source")

count = 0

while True:
    ret, frame = cap.read()

    print("\n")
    
    if(count != 0):
        print("Frame Count: ", count)
    frame = cv2.resize(frame, (0, 0), fx = 1.5, fy = 1.5)
    height, width, channels = frame.shape
 
    # 1. 目标检测
    hsvFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    sensitivity = 20
    white_lower = np.array([0,0,255-sensitivity])
    white_upper = np.array([255,sensitivity,255])
    white_mask = cv2.inRange(hsvFrame, white_lower, white_upper)

    # 形态学变换
    kernal = np.ones((3, 3), "uint8")
    c = 1

    contours_w, hierarchy_w = cv2.findContours(white_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    detections = [] 

    for contour_w in contours_w:
        area = cv2.contourArea(contour_w)
        if area > 200 and area < 100000:
            cv2.drawContours(frame, [contour_w], -1, (0, 0, 0), 1)
            x,y,w,h = cv2.boundingRect(contour_w)
            detections.append([x, y, w, h])

    # 2. 目标跟踪
    boxes_ids = tracker.update(detections)
    for box_id in boxes_ids:
        x, y, w, h, id = box_id
        cv2.putText(frame, str(id), (x - 8, y + 8), cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 0), 2)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 0), 1)

    cv2.imshow("Frame", frame) 
    count += 1
    key = cv2.waitKey(0)
    if key == 27:
        break

cap.release()
cv2.destroyAllWindows()

遇到的问题

已实现基础连续标注功能,但无法满足母涡旋标签保留的需求,比如0-9s最大的涡旋标签为3,9s之后被分配了新标签9,期望它始终保留标签3。请问现有实现思路是否正确,有什么优化建议,还是需要更换其他标准跟踪算法或者深度学习算法?


解答

你的现有思路是可行的,不需要更换深度学习算法,当前问题是跟踪逻辑存在三个核心缺陷,针对性修改即可满足需求:

  1. 匹配策略缺陷:现有逻辑用贪心的逐目标匹配,仅以固定阈值的质心距离作为判断依据,大涡旋如果因为分裂、融合导致质心短时间偏移超过20,或者小目标先匹配到了对应ID,大目标就会被误判为新目标。
    优化方向:改用匈牙利算法做全局最优匹配,将匹配代价改为质心距离+面积差的加权组合,比如代价=0.7*归一化质心距离 + 0.3*归一化面积差,面积特征的加入可以大幅降低大涡旋的误匹配概率,同时也适配你按面积判断标签继承的规则。
  2. 未处理分裂融合场景:现有逻辑默认前后帧目标一一对应,没有适配一对多(分裂)、多对一(融合)的场景,自然无法实现按面积继承标签的需求。
    优化方向:匹配完成后增加场景判断逻辑:
    • 若当前帧单个目标匹配到上一帧多个ID:判定为融合,将匹配到的旧ID中面积最大的那个分配给融合后的目标,其余ID注销
    • 若当前帧多个目标匹配到上一帧同一个ID:判定为分裂,其中面积最大的目标继承旧ID,其余目标分配新ID
  3. ID注销逻辑过于激进:现有逻辑只要某ID一帧没匹配到就直接删除,检测的微小噪声就可能导致ID跳变。
    优化方向:给每个ID增加存活缓冲计数,连续2-3帧没匹配到再注销,避免偶发检测误差导致的标签切换。

如果修改完后仍有更高精度需求,可以直接替换为SORT这类轻量成熟的多目标跟踪算法,无需引入深度学习模型,完全适配你这个背景干净、特征稳定的仿真场景。


内容的提问来源于stack exchange,提问作者Alpha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:24:04