探索计算机视觉中光流的基本原理。了解运动矢量如何驱动视频理解并增强 Ultralytics YOLO26 中的 track 能力。
光流是视觉场景中物体、表面和边缘的视在运动模式,由观察者和场景之间的相对运动引起。在计算机视觉领域,这一概念对于理解视频序列中的时间动态至关重要。通过分析两个连续帧之间像素的位移,光流算法生成一个矢量场,其中每个矢量代表特定点的运动方向和大小。这种低级视觉线索使人工智能系统不仅能感知图像中有什么,还能感知它是如何移动的,从而弥合了静态图像分析和动态视频理解之间的鸿沟。
光流的计算通常依赖于亮度恒定假设,该假设认为物体上像素的强度从一帧到下一帧保持不变,即使它在移动。算法利用这一原理,通过两种主要方法来求解运动矢量:
虽然经常协同使用,但区分光流与目标跟踪至关重要。光流是一种描述瞬时像素运动的低级操作;它不固有地理解对象身份或持久性。
相比之下,目标跟踪是一项高级任务,它定位特定实体并随时间为其分配一致的ID。高级跟踪器,例如集成到Ultralytics YOLO26中的那些,通常执行object detection以找到对象,然后使用运动线索(有时源自光流)来关联跨帧的检测。光流回答“这些像素现在移动有多快”,而跟踪回答“5号车去哪儿了?”
在像素级别估计运动的能力为广泛的复杂技术提供了动力:
以下示例演示了如何使用OpenCV库计算密集光流,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和轨迹。

开启您的机器学习未来之旅