为了计算两幅图像之间的光流,必须解决以下光流约束方程:
其中:
,
和
是时空图像亮度导数;u是水平流;v是垂直光流。
Lucas-Kanade方法:
为了解决u和v的光流约束方程,Lucas Kanade方法将原始图像分割成更小的部分块,并在每个部分中假定kua个恒定速度。然后,在每块中将光流约束方程的加权最小二乘拟合到常数模型
。该方法通过最小化下列方程来实现这种拟合:
W是强调每个部分块中心的约束的窗口函数。求解极小化问题的方法是:
Lucas-Kanade方法使用差分滤波器[-1 1]计算。
求u和v:
1,利用卷积核 [-1 8 0 -8 1] /12及其转置形式求 和
.
2,使用核[1 1]计算图像1和图像2之间的。
3,平滑梯度分量,
和
,使用一个可分离的各向同性的5×5的核,其有效的一维系数是[1 4 6 4 1]/16.
4,使用以下方法求解每个像素的2×2线性方程:
如果:,那么:A的特征值为
将特征值与阈值进行比较,该阈值对应于为降低噪声阈值而输入的值。结果属于下列情况之一:
case1:,A是非奇异的,方程组是用克莱默法则求解的。
case2:,A是奇异(不可逆),标准化梯度流计算u和v。
case3:,u和v的光流为0。
%% Compute Optical Flow Using Lucas-Kanade Algorithm
% Read in a video file.
vidReader = VideoReader('viptraffic.avi');
%%
% Create optical flow object.
opticFlow = opticalFlowLK('NoiseThreshold',0.009);
%%
% Estimate and display the optical flow of objects in the video.
while hasFrame(vidReader)
frameRGB = readFrame(vidReader);
frameGray = rgb2gray(frameRGB);
flow = estimateFlow(opticFlow,frameGray);
imshow(frameRGB)
hold on
plot(flow,'DecimationFactor',[5 5],'ScaleFactor',10)
hold off
end