我在視頻處理課程中獲得了一個任務 - 實現了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