我正在MATLAB中尝试使用一种简单的图像匹配算法来稳定视频文件。基本上,我取视频第一帧的一个窗口,用第n帧减去它。我想得到一个从第n帧到第一帧的x和y位移矢量数组。视频采用1501x971灰度格式,共391帧。
下面是我的代码。我已经让代码运行了15分钟以上,并且仍然在运行。我一直在寻找答案,并实现了我看到人们建议的int8和预分配矩阵解决方案,但它仍然运行太久。如有任何帮助,我们将不胜感激。
% 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
使用探查器。
profile on;
your_script_name;
profile viewer;
这告诉您的代码中哪些行占用了运行时的大部分时间。
输出如下https://www.mathworks.com/help/matlab/matlab_prog/profiling-for-improving-performance.html
但在阅读代码时,您应该考虑通过在矩阵/向量级别上操作来向量化代码,而不是使用for循环在元素级别上操作。请参阅这篇文章中的教程
在图像中逐像素循环计算熵的更快方法