深圳Yolo 视觉
深圳
立即加入
词汇表

光流

探索计算机视觉中光流的强大功能。了解它如何估计运动、增强视频分析并推动人工智能创新。

光流是 计算机视觉涉及 估计视觉场景中物体、表面和边缘的明显运动。这种运动是根据 观察者(如摄像机)与场景本身之间的相对运动来计算。这一过程的结果是一个 矢量场,其中每个矢量代表两个连续视频帧之间像素或特征的位移。 通过分析这些运动矢量,系统可以获得对场景动态的细粒度、低层次理解,从而回答以下关键问题 像素 "如何 "随时间移动这一关键问题。

光流的核心机制

光流的计算通常依赖于 "亮度恒定 "假设。这一原理 假定物体上特定点的像素强度在连续帧之间保持不变,即使在物体移动时也是如此。 移动。算法利用这一假设来track 位移。有两种主要方法可以确定这些运动场 运动场:

  • 密集光流:这种方法为图像中的每个像素计算运动矢量。它提供了一个全面的 高分辨率运动图,这对细粒度任务至关重要,例如 图像分割和视频 修复等精细任务所必需的。虽然计算密集,但现代 深度学习模型,如 RAFT(递归全对场变换)等深度学习模型 等深度学习模型在密集估计方面取得了超越传统数学方法的一流性能。
  • 稀疏光流:稀疏方法不分析整个图像,而是track 一组选定的明显特征,如角落或边缘。 边缘,通常使用 特征提取 技术来识别。Lucas-Kanade 方法等算法是这一类别的主要算法。由于处理的数据点较少 点,因此稀疏方法效率很高,适用于 实时推理 在这种情况下,速度比密度更重要。

光流与目标跟踪

将光流与 物体跟踪因为它们在视觉管道中的作用不同。光流是一种低层次的操作,它描述的是像素的瞬时移动,而不需要了解这些像素所代表的意义。 光流是一种低级操作,它描述像素的瞬时移动,而不了解这些像素代表什么。它本质上并不能在一段时间内保持 物体的身份。

相比之下,物体追踪是一项高级任务,它能定位特定的实体,并为其分配一个跨帧的一致 ID 在各帧之间保持一致。高级跟踪模式,例如在 Ultralytics YOLO11等高级跟踪模式,通常执行 物体检测然后 使用运动线索来关联检测结果。跟踪器可能会在内部使用光流来预测位置、 追踪器的目标是身份保持("4 号车去了哪里?"),而光流的目标是运动映射("这些像素向右移动的速度有多快? 映射("这些像素向右移动的速度有多快?)

人工智能在现实世界中的应用

光流是一种通用工具,可用于各行各业解决复杂的运动相关问题。

  • 自主系统和机器人学:在 自主车辆在自动驾驶汽车领域,光流被用于视觉测距--估计车辆自身相对于世界的运动。它有助于 检测静态检测可能会遗漏的移动障碍物,从而提高导航的安全性。同样,在 机器人中,代理使用流来操纵物体,并利用以下框架在动态环境中导航 ROS.
  • 动作识别:通过分析运动的时间模式,人工智能系统可以识别 复杂的人类动作。例如,在 智能健身技术例如,在智能健身技术中,光流可以帮助完善 姿势估计通过确保肢体 肢体运动在帧与帧之间被平滑跟踪,从而识别深蹲或网球挥拍等运动。
  • 视频稳定和压缩:消费类电子产品在很大程度上依赖于流量估计。 电子图像防抖(EIS)使用流量矢量来补偿相机抖动。此外,视频 压缩标准,如 MPEG使用运动估计 来减少文件大小,方法是只编码帧与帧之间的差异(残差),而不是完整的帧 本身。
  • 医学影像:在 医学图像分析在医学图像分析中,光流被用于track 组织的变形,如超声心动图中的心脏跳动。 这有助于医生量化器官功能和检测静态图像中看不到的异常。

实施实例

下面的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等模型的研发旨在进一步统一空间和 时间理解,以实现更快的端到端视频分析。

加入Ultralytics 社区

加入人工智能的未来。与全球创新者联系、协作和共同成长

立即加入