【发布时间】:2017-09-17 14:01:32
【问题描述】:
我得到了一个视频处理课程的作业 - 实现 Lucas-Kanade 算法。由于我们必须在金字塔模型中进行,我首先为 2 个输入图像中的每一个构建一个金字塔,然后为每个级别执行多次 LK 迭代。在每一步(迭代)中,都会运行以下代码(注意:图像是零填充的,因此我可以轻松处理图像边缘):
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 秒(!))。
我的问题:有没有办法在没有嵌套 for 循环的情况下计算这个单一的 LK 步骤?它必须更有效,因为任务的下一步是使用此算法稳定短视频..谢谢。
【问题讨论】:
-
你知道这个算法的慢步是什么吗?你试过
profiling吗? -
从未听说过
profiling,会的:)
标签: algorithm matlab image-processing video-processing opticalflow