2014-10-09 8 views
0

안녕하세요, 저는 Matlab을 사용하여 빠른 방법으로 작업하고 있습니다. 이것은 내 코드 FAST Detector의 이론입니다. 나는 내 코드가 비효율적이며 배열 부분과 루프에서 충분히 좋지 않다는 것을 안다. 이것은 내 코드입니다 :원형 배열을 가진 고속 검출기가 너무 느리게 작동합니다. Matlab (편집 : circshift 제거)

편집 : 나는 코드가 5 분 더 오랫동안 실행되기 때문에 circshift()을 제거합니다. 나는 (@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 부분을

사람이 알고 않았다 부품 코드 실행이 느린 무엇입니까?

당신을 감사합니다 여러분.

+0

바로 'C'(Mlint가 이미 경고 한 것)가되어 코드가 비효율적입니다. 사전 할당을 고려하십시오. 또한, 달성하고자하는 바가 없으면 코드를 리팩터링하기가 어렵습니다. 말로 설명하십시오. – Oleg

+1

[this] (http://www.edwardrosten.com/work/fast.html) 웹 페이지의 코드를 참조하십시오. –

+0

@OlegKomarov 나는 단지 mlint가 코드 XD를 확인하기 위해 존재한다는 것을 알고 있기 때문에'C'만으로 느린 코드를 의미합니까? 내가 성취하고자하는 것은이 코드를 더 빨리 만드는 것입니다. 왜냐하면 솔직히 말해서 어떤 코드가 실행 속도가 느려지는지 알지 못하기 때문입니다. 내 기대는 반복되고있다. C (좌표)를 저장하는 다른 방법이 있습니까? @ ParagS.Chandakkar 예, 저 웹 페이지를 참조하십시오 :) – mumir

답변

0
당신은 루프를 모두 내부를 벡터화와 함께 시작할 수

.

기본적으로 당신을 배열에서 처음 9 개의 원소가 있다면 테스트해라.

bigger = arrayK > plus;을 사용하면 plus보다 큰 모든 값이 식별됩니다. 회선을 사용하여

이 시퀀스를 검출 할 수있다 :

sequences = conv(double([bigger(end-4:end),bigger,bigger(1:4)]),ones(1,9),'same'); 

이 값과 같거나 구 더있는 경우를, 당신은 당신의 결과에 첨부 할 수있는 것은 :

idx = find(sequences==9,1); 
if(~isempty(idx)) 
    C =[C; [b,k]]; 
end 

같은이 될 수 있습니다 루프에 대한 두 번째로 완료 ...

+0

해결책을 주셔서 감사합니다. 정말 고맙습니다. 하지만 위의 코드를 사용하여 시도하고 매우 천천히, 거의 같은 circshift 사용하면 실행됩니다. 'conv' 부분은 실제로 오랜 시간이 걸립니다. – mumir

1

코드 정리

루프 반복마다 pos을 선언하고 있습니다. pos이 상수 인 경우 모든 루프에서 재정의되지 않도록 함수의 맨 위에 선언하십시오.

나는이가 많은 일을 속도를 기대하지 않습니다,하지만 당신은 ... 같은 arrayK(16)arrayK(1)p16

arrayK(1) = gray(b-3,k); 

대신

p1 = gray(b-3,k); 

p1을 대체 할 수 사전 할당

prea 줄 경우

C = [C; [b k]]; 

시간이 오래 복용 그래서 llocate 어레이는, 당신은 함수의 시작 부분에 긴 배열에 C를 미리 할당 한 후 C에서 특정 위치에 bk를 지정해야합니다

C = ones(10000,2); 
idx = 0; 
... 
inside the loop 
... 
idx = idx + 1; 
C(idx,:) = [b k]; 
... 
at the end 
... 
C = C(1:idx,:); 
+0

루프를 벡터화하는 Steffen의 제안은 또한 많은 도움이됩니다. – Trogdor

+0

제안 해 주셔서 감사합니다. 감사드립니다. 나는 ** Preallocation ** 부분이 매우 훌륭하다고 생각한다. ** Code Cleanup ** 또한 1 분에서 2 초를 절약 할 수있다. (나는이 코드가 왜 그렇게 느린 지 알지 못한다.) – mumir

+0

불행히도 MATLAB은 단순히 느릴 때가있다. 반복을 많이하는 'for'루프와 같은 일부 연산이 발생합니다. 매우 빠르게 증가 할 수는 없지만, 'conv'를 사용하지 않고 Steffen이 제안한 것과 유사하게 벡터화하는 방법이있을 수 있습니다. 많은 시간이 조금 걸립니다. – Trogdor