Я пытаюсь стабилизировать видеофайл в MATLAB, используя простой алгоритм сопоставления изображений. По сути, я беру окно первого кадра видео и вычитаю его из n-го кадра. Я хочу получить массив векторов смещения x и y от положения n-го кадра до первого. Видео в формате серого 1501x971 с 391 кадром.
Ниже приведен мой код. Я позволил коду работать более 15 минут и все еще работать. Я искал ответы и внедрял матричные решения int8 и preallocating, которые, как я видел, предлагали люди, но они все еще работают слишком долго. Любая помощь будет оценена.
% Define image region (window)
xmin = 35;
xmax = 1465;
ymin = 35;
ymax = 940;
% Matching algorithm
error = uint16(10^8); % set error to a larger number than expecting in the loop
deltax = 0;
deltay = 0;
deltaxArray = zeros(1,N,'int8'); % prealloacting arrays
deltayArray = zeros(1,N,'int8'); % using int8 to optimize code
deltaxArray(1) = 0;
deltayArray(1) = 0;
for n = 2:N % N = number of frames
for deltay = -34:31 % Iterating over all possible displacements
for deltax = -34:36
current_error = uint16(sum(abs(f(1, ymin+deltay:ymax+deltay , xmin+deltax:xmax+deltax ) - f(n, ymin:ymax, xmin:xmax)),'all')); % f is the video array
if current_error < error % searching for the smallest error in the nth frame
error = current_error; % set error if current error is smaller
deltaxArray(n) = deltax; % save x displacement coordinate
deltayArray(n) = deltay; % save y displacement coordinate
end
end
end
error = uint16(10^8); % reset error for next iteration
end