首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >环形阵列的快速探测器运行太慢了。Matlab (编辑:删除circshift)

环形阵列的快速探测器运行太慢了。Matlab (编辑:删除circshift)
EN

Stack Overflow用户
提问于 2014-10-09 15:47:57
回答 2查看 292关注 0票数 0

大家好,我正在用Matlab编写快速方法,但在我的笔记本上运行太慢了。这就是我的代码FAST Detector的理论。我知道我的代码效率低下,也不够好,尤其是在数组部分和循环中。这是我的代码:

编辑:我删除了circshift(),因为它使代码多运行5分钟。我试着使用这段代码(按照@Oleg的建议使用pos ),它仍然运行很慢,大约运行了1分钟。

代码语言:javascript
复制
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部分的代码缩短为数组?

有没有人知道是哪些部分导致代码运行如此缓慢?

谢谢大家。

EN

回答 2

Stack Overflow用户

发布于 2014-10-10 20:44:35

代码清理

您在循环的每次迭代中都声明了pos。如果pos是一个常量,请在函数的顶部声明它,这样就不会在每个循环中重新定义它。

我不认为这会大大加快速度,但您也可以将p1p16替换为arrayK(1)arrayK(16),例如...

代码语言:javascript
复制
arrayK(1) = gray(b-3,k);

而不是

代码语言:javascript
复制
p1 = gray(b-3,k);

Preallocation

预先分配数组是一种很好的做法,因此如果行

代码语言:javascript
复制
C = [C; [b k]];

花费了很长时间,您应该在函数开始时将C预先分配给一个长数组,然后将bk分配给C中的特定位置。

代码语言:javascript
复制
C = ones(10000,2);
idx = 0;
... 
inside the loop
...
idx = idx + 1;
C(idx,:) = [b k];
...
at the end
...
C = C(1:idx,:);
票数 1
EN

Stack Overflow用户

发布于 2014-10-09 23:18:28

您可以从向量化两个内部for循环开始。

你基本上要做的就是测试数组中的前9个元素。

对于bigger = arrayK > plus;,所有大于plus的值都会被识别。

通过使用卷积,可以检测序列:

代码语言:javascript
复制
sequences = conv(double([bigger(end-4:end),bigger,bigger(1:4)]),ones(1,9),'same');

如果存在等于或大于9的值,则可以将其附加到结果中:

代码语言:javascript
复制
idx = find(sequences==9,1);
if(~isempty(idx))
    C =[C; [b,k]]; 
end

第二个for循环也可以做到这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26273000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档