我在视频处理课程中获得了一个任务 - 实现了Lucas-Kanade算法。由于我们必须在金字塔模型中做到这一点,因此我首先为每个输入图像构建一个金字塔,然后为每个级别执行一系列LK迭代。在每一个步骤(迭代),下面的代码运行(注意:图片是零填充,所以我可以很容易地处理图像边缘):Lukas-Kanade步骤的高效matlab实现
function [du,dv]= LucasKanadeStep(I1,I2,WindowSize)
It = I2-I1;
[Ix, Iy] = imgradientxy(I2);
Ixx = imfilter(Ix.*Ix, ones(5));
Iyy = imfilter(Iy.*Iy, ones(5));
Ixy = imfilter(Ix.*Iy, ones(5));
Ixt = imfilter(Ix.*It, ones(5));
Iyt = imfilter(Iy.*It, ones(5));
half_win = floor(WindowSize/2);
du = zeros(size(It));
dv = zeros(size(It));
A = zeros(2);
b = zeros(2,1);
%iterate only on the relevant parts of the images
for i = 1+half_win : size(It,1)-half_win
for j = 1+half_win : size(It,2)-half_win
A(1,1) = Ixx(i,j);
A(2,2) = Iyy(i,j);
A(1,2) = Ixy(i,j);
A(2,1) = Ixy(i,j);
b(1,1) = -Ixt(i,j);
b(2,1) = -Iyt(i,j);
U = pinv(A)*b;
du(i,j) = U(1);
dv(i,j) = U(2);
end
end
end
,你可以看到,在代码我计算这对每一个像素,这需要相当长的时间(整个处理2个图像 - 包括建筑物3倍的水平金字塔和3 LK步骤,每个级别都需要大约25秒(!)远程连接到我的大学服务器)。
我的问题:有没有办法计算这个单一的LK步骤没有嵌套for循环?它必须更高效,因为下一步的任务是使用这种算法来稳定短视频。谢谢。
你知道这是什么算法的慢一步是什么?你有没有试过['profiling'](https://www.mathworks.com/help/matlab/ref/profile.html)? – qbzenker
从未听说过'profiling'但是,会做:) – noamgot