Point Tracking
点跟踪会在视频中跟踪选定的点,并报告每个点在每一帧中的位置及其是否可见。涵盖方法、模型和用途。
点跟踪是计算机视觉中的一项任务,用于在视频中跟踪单个点:给定一帧中的查询点,例如袖子上的某个点或窗户的角,跟踪器会估计同一个物理点在其他每一帧中的位置,以及它是否可见。近期研究将其称为任意点跟踪(TAP),因为查询点可以是任意像素,而不是预先定义的关键点。点跟踪会跨多帧跟踪一组稀疏点,包括被遮挡时的情况;这使它有别于使用带 ID 的边界框跟踪完整物体的目标跟踪,也不同于估计连续两帧之间每个像素运动的光流。
点跟踪的工作原理#
经典的 Kanade-Lucas-Tomasi(KLT)跟踪器会选择在两个方向上纹理都明显的角点,也就是 Shi-Tomasi 提出的“适合跟踪的优良特征”;接着,它会求解最能对齐角点周围图像块的微小位移,从而在下一帧中找到每个角点,并使用图像金字塔处理较大幅度的运动。OpenCV实现了这两个步骤:
import cv2
import numpy as np
# Read an overhead clip of people walking and pick 300 corners in its first frame
cap = cv2.VideoCapture("https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4")
prev = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2GRAY)
points = cv2.goodFeaturesToTrack(prev, maxCorners=300, qualityLevel=0.01, minDistance=5)
start = points.copy()
# Follow every point frame to frame with pyramidal Lucas-Kanade optical flow
while (frame := cap.read()[1]) is not None:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
points, status, _ = cv2.calcOpticalFlowPyrLK(prev, gray, points, None)
found = status.ravel() == 1 # keep only the points found again
points, start, prev = points[found], start[found], gray
distance = np.linalg.norm(points - start, axis=-1)
print(f"{len(points)} of 300 points tracked to the last frame, median shift {np.median(distance):.1f} px")它会输出 292 of 300 points tracked to the last frame, median shift 28.7 px:在片段的 62 帧中,跟踪器丢失了 8 个点,其余点最终与起始位置的中位距离为 28.7 像素。KLT 只比较连续帧,因此小误差会逐渐累积;它也无法识别遮挡:路人遮住地面上的点后,该点可能滑到路人身上,但跟踪器仍会持续报告它。
学习式点跟踪器#
深度学习跟踪器会同时分析多帧,并为每一帧预测位置和可见性标记。TAP-Vid基准测试于 2022 年定义了这项任务,其中包含由人工标注点轨迹的真实视频。PIPs(2022)会在帧窗口内不断优化点的轨迹,从而跨越短暂遮挡;TAPIR(2023)会先将查询点的特征与每一帧进行匹配,再利用时间上下文优化跟踪结果。Meta 的 CoTracker 使用 Transformer 联合跟踪多个点,因此同一物体上的点可以在其中一个点被遮挡时相互提供帮助。真实视频中的标注轨迹十分稀缺,因此 CoTracker3(2024)先在合成视频上训练,再使用其他跟踪器为真实视频生成的伪标签继续训练;其报告结果优于使用多出 1,000 倍数据训练的此前跟踪器。
实际应用#
Ultralytics 跟踪模式会使用点跟踪来抵消多目标跟踪中的相机运动:其默认的 TrackTrack 跟踪器和 BoT-SORT 每帧最多选取 400 个角点,用金字塔 Lucas-Kanade 光流跟踪这些角点,再使用 RANSAC(gmc_method: sparseOptFlow)拟合旋转、缩放和平移;随后,在将各条轨迹的预测框与新的 YOLO26 检测结果匹配之前,先对预测框进行相应偏移。










