我在光流上實現了Horn & Schunck paper的偏導數方程。但是,即使是相對較小的圖像(320x568),也需要很長的時間(約30-40秒)才能完成。我認爲這是由於320 x 568 = 181760循環迭代造成的,但我找不出一個更有效的方法來做到這一點(缺少MEX文件)。高效地計算光流參數 - MATLAB
有什麼方法可以將它變成更高效的MATLAB操作(也許是卷積)?我可以弄清楚如何做到這一點,作爲It
的卷積,但不是Ix
和Iy
。我也考慮過矩陣移位,但只要我能弄明白,那也只適用於It
。
有沒有其他人遇到這個問題,並找到了解決辦法?
我的代碼如下:
function [Ix, Iy, It] = getFlowParams(img1, img2)
% Make sure image dimensions match up
assert(size(img1, 1) == size(img2, 1) && size(img1, 2) == size(img2, 2), ...
'Images must be the same size');
assert(size(img1, 3) == 1, 'Images must be grayscale');
% Dimensions of original image
[rows, cols] = size(img1);
Ix = zeros(numel(img1), 1);
Iy = zeros(numel(img1), 1);
It = zeros(numel(img1), 1);
% Pad images to handle edge cases
img1 = padarray(img1, [1,1], 'post');
img2 = padarray(img2, [1,1], 'post');
% Concatenate i-th image with i-th + 1 image
imgs = cat(3, img1, img2);
% Calculate energy for each pixel
for i = 1 : rows
for j = 1 : cols
cube = imgs(i:i+1, j:j+1, :);
Ix(sub2ind([rows, cols], i, j)) = mean(mean(cube(:, 2, :) - cube(:, 1, :)));
Iy(sub2ind([rows, cols], i, j)) = mean(mean(cube(2, :, :) - cube(1, :, :)));
It(sub2ind([rows, cols], i, j)) = mean(mean(cube(:, :, 2) - cube(:, :, 1)));
end
end
在計算機視覺系統工具箱中實現了幾種光流算法。參見'opticalFlowHS','opticalFlowLK','opticalFlowFarneback'。 – Dima