主要内容

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

estimateFlow

估计光流

说明

flow = estimateFlow(opticFlow,I) 用于估计两个连续视频帧之间的光流。

示例

示例

全部折叠

为输入视频文件 visiontraffic.avi 创建一个 VideoReader 对象。将要读取的帧的时间戳指定为 11。

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

将光流估计方法指定为 opticalFlowHS。输出是一个对象,用于指定光流估计方法及其属性。

opticFlow = opticalFlowHS
opticFlow = 
  opticalFlowHS with properties:

            Smoothness: 1
          MaxIteration: 10
    VelocityDifference: 0

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

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

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

while hasFrame(vidReader)
    frameRGB = readFrame(vidReader);
    frameGray = im2gray(frameRGB);  
    flow = estimateFlow(opticFlow,frameGray);
    imshow(frameRGB)
    hold on
    plot(flow,DecimationFactor=[5 5],ScaleFactor=5,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.

输入参数

全部折叠

用于光流估计的对象,指定为以下选项之一:

输入参量 opticFlow 定义了用于估计光流速度矩阵的光流估计方法及其属性。

当前视频帧,指定为尺寸为 m×n 的二维灰度图像。输入图像由使用 VideoReader 对象读取的当前视频帧生成。为了估计光流,必须将 RGB 格式的视频帧转换为二维灰度图像。

输出参量

全部折叠

用于存储光流速度矩阵的对象,以 opticalFlow 对象的形式返回。

算法

该函数使用输入对象 opticFlow 指定的方法,对输入视频进行光流估计。光流是通过估计两个连续视频帧之间的运动来计算的。在给定时刻 tcurrent 处的视频帧 T 称为当前帧,而视频帧 T-1 称为上一帧。在时间 tcurrent = 0 时,上一帧的初始值被设置为灰度值为 0 的均匀图像的值。

注意

如果将 opticFlow 指定为 opticalFlowLKDoG 对象,则估计结果会产生与视频帧数成比例的延迟。延迟的时长取决于在 opticalFlowLKDoG 对象中定义的 NumFrames 的值。在时间点 tcurrent 估计的视频帧的光流,对应于时间点 tflow=(tcurrent(NumFrames1)/2) 的视频帧。tcurrent 是当前视频帧的时间点。

扩展功能

全部展开

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

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

版本历史记录

在 R2015a 中推出

另请参阅