探索计算机视觉中光流的强大功能。了解它如何估计运动、增强视频分析并推动人工智能创新。
光流是 计算机视觉涉及 估计视觉场景中物体、表面和边缘的明显运动。这种运动是根据 观察者(如摄像机)与场景本身之间的相对运动来计算。这一过程的结果是一个 矢量场,其中每个矢量代表两个连续视频帧之间像素或特征的位移。 通过分析这些运动矢量,系统可以获得对场景动态的细粒度、低层次理解,从而回答以下关键问题 像素 "如何 "随时间移动这一关键问题。
光流的计算通常依赖于 "亮度恒定 "假设。这一原理 假定物体上特定点的像素强度在连续帧之间保持不变,即使在物体移动时也是如此。 移动。算法利用这一假设来track 位移。有两种主要方法可以确定这些运动场 运动场:
将光流与 物体跟踪因为它们在视觉管道中的作用不同。光流是一种低层次的操作,它描述的是像素的瞬时移动,而不需要了解这些像素所代表的意义。 光流是一种低级操作,它描述像素的瞬时移动,而不了解这些像素代表什么。它本质上并不能在一段时间内保持 物体的身份。
相比之下,物体追踪是一项高级任务,它能定位特定的实体,并为其分配一个跨帧的一致 ID 在各帧之间保持一致。高级跟踪模式,例如在 Ultralytics YOLO11等高级跟踪模式,通常执行 物体检测然后 使用运动线索来关联检测结果。跟踪器可能会在内部使用光流来预测位置、 追踪器的目标是身份保持("4 号车去了哪里?"),而光流的目标是运动映射("这些像素向右移动的速度有多快? 映射("这些像素向右移动的速度有多快?)
光流是一种通用工具,可用于各行各业解决复杂的运动相关问题。
下面的Python 示例演示了如何使用 OpenCV库计算密集光流。该示例使用 Gunnar Farneback 算法,这是一种常用的密集光流估算方法。
import cv2
import numpy as np
# Load two consecutive frames (ensure these files exist)
frame1 = cv2.imread("frame1.jpg")
frame2 = cv2.imread("frame2.jpg")
# Convert frames to grayscale
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# Calculate dense optical flow using Farneback's algorithm
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"Flow shape: {flow.shape}") # Output: (Height, Width, 2)
print(f"Max motion magnitude: {np.max(mag):.2f} pixels")
适用于希望将运动分析与物体检测相结合的用户、 Ultralytics 检测模型可以 流算法相结合,创建强大的分析管道。光流算法提供原始运动数据、 更高级别的模型,如 YOLO11等更高层次的模型提供了 等高级模型提供有效解释运动所需的语义理解。目前正在对以下模型进行研发 YOLO26等模型的研发旨在进一步统一空间和 时间理解,以实现更快的端到端视频分析。