大家好,我正在用Matlab编写快速方法,但在我的笔记本上运行太慢了。这就是我的代码FAST Detector的理论。我知道我的代码效率低下,也不够好,尤其是在数组部分和循环中。这是我的代码:
编辑:我删除了circshift(),因为它使代码多运行5分钟。我试着使用这段代码(按照@Oleg的建议使用pos ),它仍然运行很慢,大约运行了1分钟。
clc
clear all
close all
[file path]=uigetfile('*.jpg','Select Input');
im=imread([path file]);
gray=rgb2gray(im);
% function [bestpoint, sortedR] = FASTdetector2(gray)
[r c] = size(gray);
thres = std(double(gray(:)));
% thres = 50;
C = [];
for b = 19:r-19
for k = 19:c-19
p = gray(b,k);
p1 = gray(b-3,k);
p2 = gray(b-3,k+1);
p3 = gray(b-2,k+2);
p4 = gray(b-1,k+3);
p5 = gray(b,k+3);
p6 = gray(b+1,k+3);
p7 = gray(b+2,k+2);
p8 = gray(b+3,k+1);
p9 = gray(b+3,k);
p10 = gray(b+3,k-1);
p11 = gray(b+2,k-2);
p12 = gray(b+1,k-3);
p13 = gray(b,k-3);
p14 = gray(b+1,k-3);
p15 = gray(b+2,k-2);
p16 = gray(b+3,k-1);
arrayK = [p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16];
pos = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8];
plus = p + thres;
min = p - thres;
count = 0;
Ar = size(arrayK,2);
for i = 1:Ar+8
if arrayK(pos(i)) > plus
count = count + 1;
if count >= 9
C = [C; [b k]];
break
end
else
count = 0;
continue
end
end
for i = 1:Ar+8
if arrayK(pos(i)) < min
count = count + 1;
if count >= 9
C = [C; [b k]];
break
end
else
count = 0;
continue
end
end
end
end
x = C(:,1);
y = C(:,2);
R = HarrisMeasure(x,y);
absR = abs(R);
[val, index] = sort(absR,'descend');
sortedC = C(index,:);
Nindex = size(x,1);
if Nindex < 50
bestpoint = sortedC(1:Nindex,:);
sortedR = val(1:Nindex);
else
bestpoint = sortedC(1:50,:);
sortedR = val(1:50);
end
imshow(gray); hold on
plot(bestpoint(:,2),bestpoint(:,1),'r*')
% end这段代码对每个图像运行大约5分钟:(有人能帮我找出替代代码吗?或者可能将p1 - p16部分的代码缩短为数组?
有没有人知道是哪些部分导致代码运行如此缓慢?
谢谢大家。
发布于 2014-10-10 20:44:35
代码清理
您在循环的每次迭代中都声明了pos。如果pos是一个常量,请在函数的顶部声明它,这样就不会在每个循环中重新定义它。
我不认为这会大大加快速度,但您也可以将p1到p16替换为arrayK(1)到arrayK(16),例如...
arrayK(1) = gray(b-3,k);而不是
p1 = gray(b-3,k);Preallocation
预先分配数组是一种很好的做法,因此如果行
C = [C; [b k]];花费了很长时间,您应该在函数开始时将C预先分配给一个长数组,然后将b和k分配给C中的特定位置。
C = ones(10000,2);
idx = 0;
...
inside the loop
...
idx = idx + 1;
C(idx,:) = [b k];
...
at the end
...
C = C(1:idx,:);发布于 2014-10-09 23:18:28
您可以从向量化两个内部for循环开始。
你基本上要做的就是测试数组中的前9个元素。
对于bigger = arrayK > plus;,所有大于plus的值都会被识别。
通过使用卷积,可以检测序列:
sequences = conv(double([bigger(end-4:end),bigger,bigger(1:4)]),ones(1,9),'same');如果存在等于或大于9的值,则可以将其附加到结果中:
idx = find(sequences==9,1);
if(~isempty(idx))
C =[C; [b,k]];
end第二个for循环也可以做到这一点。
https://stackoverflow.com/questions/26273000
复制相似问题