探索计算机视觉中光流的基础原理。了解运动向量如何驱动视频理解,并Ultralytics 的追踪能力。
光流是指视觉场景中物体、表面和边缘因观察者与场景之间的相对运动而产生的视动模式。在计算机视觉领域,这一概念对于理解视频序列中的时序动态至关重要。 通过分析连续两帧图像中像素的位移,光流算法生成矢量场——其中每个矢量代表特定点的运动方向与速度。这种低级视觉线索使人工智能系统不仅能感知图像内容,更能理解动态变化,从而弥合了静态图像分析与动态视频理解之间的鸿沟。
光流计算通常基于亮度恒定性假设,该假设认为物体上像素的亮度在相邻帧之间保持恒定,即使物体发生移动。算法利用这一原理通过两种主要方法求解运动向量:
尽管二者常被并用,但区分光流与目标追踪至关重要。光流是一种低级运算,用于描述像素的瞬时运动;它本身并不理解目标的身份或持续性。
相比之下,目标追踪是一项高级任务,它定位特定实体并在时间维度上为其分配一致的ID。先进的追踪器(如Ultralytics 追踪器)通常先通过目标检测定位目标,再利用运动线索(有时源自光流)将不同帧中的检测结果关联起来。 光流解答的是"当前像素移动速度如何",而追踪则解答"5号车去了哪里"。
像素级运动估计能力为众多尖端技术提供了支持:
以下示例演示了如何使用计算机视觉生态系统中的标准工具OpenCV 计算密集光流。该代码片段采用Farneback算法,在两个连续帧之间生成光流图。
import cv2
import numpy as np
# Simulate two consecutive frames (replace with actual image paths)
frame1 = np.zeros((100, 100, 3), dtype=np.uint8)
frame2 = np.zeros((100, 100, 3), dtype=np.uint8)
cv2.rectangle(frame1, (20, 20), (40, 40), (255, 255, 255), -1) # Object at pos 1
cv2.rectangle(frame2, (25, 25), (45, 45), (255, 255, 255), -1) # Object moved
# Convert to grayscale for flow calculation
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# Calculate dense optical flow
flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
# Compute magnitude and angle of 2D vectors
mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
print(f"Max motion detected: {np.max(mag):.2f} pixels")
对于需要对象持久化而非原始像素运动的高级应用,用户应考虑 Ultralytics YOLO11 和 YOLO26 中提供的跟踪模式。这些模型抽象了运动分析的复杂性,为从交通监控到零售分析等任务提供开箱即用的稳健物体ID和轨迹。