此问题基于版本2015a中光流系统对象的在线文档中的修改后的Matlab代码,如opticalFlowLK class中所示
clc; clearvars; close all;
inputVid = VideoReader('viptraffic.avi');
opticFlow = opticalFlowLKDoG('NumFrames',3);
inputVid.currentTime = 2;
k = 1;
while inputVid.currentTime<=2 + 1/inputVid.FrameRate
frameRGB{k} = readFrame(inputVid);
frameGray{k} = rgb2gray(frameRGB{k});
flow{k} = estimateFlow(opticFlow,frameGray{k});
k = k+1;
end
通过查看流{2} .Vx和流{2}。我得到了描述从frameGray {1}到frameGray {2}的运动的运动图U和V.
我想直接使用flow {2} .Vx和flow {2}。直接对frameGray {1}中的数据进行处理,以便使frameGray {1}在视觉上与frameGray {2}类似。
我试过这段代码:
[x, y] = meshgrid(1:size(frameGray{1},2), 1:size(frameGray{1},1));
frameGray1Warped = interp2(double(frameGray{1}) , x-flow{2}.Vx , y-flow{2}.Vy);
但除了破坏图像质量之外,它似乎并没有做太多事情(但是物体不会在frameGray {2}中向其位置显示任何真实的动作。
我添加了3张图像,显示了2张原始帧,然后使用运动场扭曲第1帧,看起来与第2帧类似:
可以很容易地看出,框架1翘曲到2基本上是框架1,质量下降,但汽车根本没有移动。也就是说 - 汽车的位置是相同的:查看靠近摄像机的汽车相对于靠近它的道路分隔线;它在第1帧和第1帧中几乎相同,但是在第2帧中有所不同。