主要内容

本页采用了机器翻译。点击此处可查看英文原文。

opticalFlowFarneback

用于基于 Farneback 方法估计光流的对象

说明

使用 Farneback 方法创建一个光流对象,用于估计移动物体的方向和速度。使用对象函数 estimateFlow 来估计光流向量。使用 reset 对象函数,可以重置光流对象的内部状态。

创建对象

描述

opticFlow = opticalFlowFarneback 返回一个光流对象,您可以利用它来估计视频中移动物体的方向和速度。光流是采用法恩巴克 (Farneback) 方法估算的。

opticFlow = opticalFlowFarneback(Name,Value) 返回一个光流对象,其属性由一个或多个 Name,Value 参量指定。任何未指定的属性均采用默认值。用引号将每个属性名称引起来。

例如,opticalFlowFarneback('NumPyramidLevels',3)

示例

属性

全部展开

金字塔层数,指定为一个正标量。该值将初始图像作为图层之一包含在内。当将此值设置为 1 时,该函数仅根据原始图像帧估计光流,且不进行金字塔分解。建议的值范围在 14 之间。

图像缩放比例,指定为取值范围在 (0,1) 之间的正标量。该值指定了每个金字塔层级的降采样率。值 0.5 将生成一个经典金字塔,其中金字塔的分辨率在每一层都会减半。金字塔的最底层具有最高的分辨率。

每个金字塔层级的搜索迭代次数,以正整数表示。Farneback 算法会在金字塔的每个层级上对关键点进行迭代搜索,直到收敛。

像素邻域的大小,以正整数形式指定。增大邻域大小以增强运动模糊效果。模糊运动可获得更稳健的光流估计。NeighborhoodSize 的典型值是 57

平滑滤波器的平均尺寸,指定为 [2, Inf) 范围内的正整数。算法计算出位移(流)后,使用尺寸为 (FilterSize * FilterSize) 的高斯滤波器对邻域进行平均处理。此外,靠近边界的像素会被赋予较低的权重,因为该算法认为这些位置的多项式展开系数可靠性较低。增大滤波器尺寸可以提高算法对图像噪声的稳健性。滤波器尺寸越大,算法处理图像噪声和快速运动检测的能力就越强,从而使其更加稳健。

对象函数

estimateFlow估计光流
resetReset the internal state of the optical flow estimation object

示例

全部折叠

读取一个视频文件。指定要读取的帧的时间戳。

vidReader = VideoReader('visiontraffic.avi','CurrentTime',11);

创建一个基于 Farneback 方法的光流对象,用于估计光流。输出是一个对象,用于指定光流估计方法及其属性。

opticFlow = opticalFlowFarneback
opticFlow = 
  opticalFlowFarneback with properties:

    NumPyramidLevels: 3
        PyramidScale: 0.5000
       NumIterations: 3
    NeighborhoodSize: 5
          FilterSize: 15

创建一个自定义图窗,用于可视化光流向量。

h = figure;
movegui(h);
hViewPanel = uipanel(h,'Position',[0 0 1 1],'Title','Plot of Optical Flow Vectors');
hPlot = axes(hViewPanel);

读取图像帧并将其转换为灰度图像。根据连续的图像帧估计光流。显示当前图像帧,并将光流向量以箭头图的形式绘制出来。

while hasFrame(vidReader)
    frameRGB = readFrame(vidReader);
    frameGray = im2gray(frameRGB);  
    flow = estimateFlow(opticFlow,frameGray);
    
    imshow(frameRGB)
    hold on
    plot(flow,'DecimationFactor',[5 5],'ScaleFactor',2,'Parent',hPlot);
    hold off
    pause(10^-3)
end

Figure contains an axes object and an object of type uipanel. The hidden axes object contains 2 objects of type image, quiver.

Figure contains an axes object and an object of type uipanel. The hidden axes object contains 2 objects of type image, quiver.

算法

Farneback 算法会生成一个图像金字塔,其中每一层的分辨率都比上一层低。当您选择大于 1 的金字塔级别时,算法可以从最低级别开始,在多个分辨率级别上追踪这些点。增加金字塔层数,可使算法处理帧与帧之间更大的点位移。然而,计算量也会随之增加。该图展示了一个由三层组成的图像金字塔。

跟踪从最低分辨率级别开始,并持续进行直至收敛。在某一层检测到的点位置将作为关键点传递到下一层。通过这种方式,该算法在每个级别上都会进一步优化跟踪效果。金字塔分解使该算法能够处理较大的像素位移,即位移距离可能大于邻域大小。

参考

[1] Farneback, G. “Two-Frame Motion Estimation Based on Polynomial Expansion.” In Proceedings of the 13th Scandinavian Conference on Image Analysis, 363 - 370. Halmstad, Sweden: SCIA, 2003.

扩展功能

全部展开

GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。

版本历史记录

在 R2015b 中推出