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

如何追踪2D运动粒子轨迹?遇粒子出入帧、尺寸差异等问题求方案

运动粒子轨迹追踪问题解决思路

核心问题

  • 不同帧中粒子存在出入画面、尺寸不一的情况
  • 使用trackpy手动循环定位粒子后,轨迹绘图显示空白

代码问题分析与修复步骤

1. 修复帧标记缺失(空白图核心原因)

你的手动循环替代tp.batch的逻辑没问题,但必须给每帧的定位结果添加frame列——trackpy的link函数依赖该列区分不同帧的粒子,缺失会导致轨迹无法建立关联:

f = pd.DataFrame()
for i in range(len(frames)):
    f1 = tp.locate(frames[i], 31, invert=True, threshold=9)
    f1['frame'] = i  # 关键:给当前帧的粒子添加帧号标记
    f = pd.concat([f, f1])

2. 适配粒子尺寸不一的情况

固定粒子直径(31)会导致尺寸变化的粒子无法被正确检测,建议调整检测逻辑:

  • 用minmass参数替代单纯的threshold,通过粒子总亮度过滤,稳定性更强
  • 尝试多尺度检测,覆盖不同尺寸的粒子:
diameters = [21, 31, 41]  # 覆盖粒子可能的尺寸范围
f = pd.DataFrame()
for i in range(len(frames)):
    frame_detections = []
    for d in diameters:
        # 用minmass替代threshold,基于粒子亮度过滤
        ff = tp.locate(frames[i], d, invert=True, minmass=1000)
        frame_detections.append(ff)
    # 合并同一帧的多尺寸检测结果,去重重复粒子
    f1 = pd.concat(frame_detections).drop_duplicates(subset=['x', 'y'])
    f1['frame'] = i
    f = pd.concat([f, f1])

3. 处理粒子出入画面的情况

粒子进出画面时,需调整链接参数适配:

  • 合理设置search_range,匹配粒子每帧的最大移动距离
  • 启用memory参数,允许粒子消失几帧后重新被链接
# search_range设为粒子每帧最大移动距离,memory允许粒子消失2帧后重新关联
t = tp.link(f, search_range=10, memory=2)

如果粒子运动速度波动大,可结合卡尔曼滤波预测位置:

from trackpy.predict import Predict
pred = Predict()  # 初始化卡尔曼滤波预测器
t = tp.link_df(f, search_range=10, predictor=pred.predict)

4. 验证中间结果

绘图前先确认轨迹数据有效性:

print(t.head())
print("有效轨迹数量:", t['particle'].nunique())

# 单独绘制某一粒子的轨迹,验证是否存在有效数据
particle_0 = t[t['particle'] == 0]
plt.plot(particle_0['x'], particle_0['y'])
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:21:14