2014-10-19 49 views
2

我试图优化我的哈里斯角点检测器,以使其足够快速,以便最终用于SLAM应用程序的实时特征提取。优化哈里斯角点检测器

传统的Harris角点检测步骤如下:

  1. 计算图像导数(梯度)Ix和Iy使用图像卷积核(k_dxk_dy)。
  2. 计算二阶导数Ixx = Ix^2,Iyy = Iy^2和Ixy = Ix * Iy。
  3. 使用高斯内核对来自步骤2的三个二阶导数进行滤波(k_gaussian)。
  4. 使用文献中所述的公式计算Harris响应。

到目前为止好。我已经实现了上述步骤并且有一个工作程序。但是,我们知道,卷积是一个交换代数,这意味着:

  1. F#G =克·F
  2. F#(克#H)=(F#克)#ħ
  3. F#( G + H)=(F#G)+(F#1H)
  4. 常数*(F#克)=(常数* F)#克

其中(#)是卷积运算。

所以实质上我们可以结合各种内核来减少计算时间。
我希望能够利用这个优势将步骤(1)中使用的图像梯度内核与步骤(3)中使用的高斯内核相结合,以减少计算时间。不幸的是步骤(2)阻止我这样做,如:
[(IMk_dx)^ 2]#k_gaussian =! (IMk_dxk_gaussian)^ 2

其中IM是图像。所以这两个内核不能合并。

我的问题:有没有办法做到这一点,或者它根本不可能?如果不可能,那么有没有一种方法可以计算出一个组合内核,即近似于的真实答案。即使它很差近似值,也可能会降低计算成本。

如果您想知道,我已经在使用CUDA在GPU上执行图像卷积并且角落探测器已经相当快。但我需要进一步改进以便为剩余的SLAM算法分配更大的时间范围。

+0

已经有一个很好的答案。有两件事情需要注意:(a)选择一个针对GPU/CUDA优化的特征检测器。 (b)过早优化。如果角落探测器速度很快,如果将速度加倍,您将获得多少收益?听起来它可能会从5%的时间移动到2.5%的时间...... – Unapiedra 2014-10-20 15:57:49

回答

2

使用卷积的内核的直接组合是不可能的。 Ixx = Ix^2,Iyy = Iy^2和Ixy = Ix * Iy不是通过卷积找到的(它不是线性的)。

优化的一些技巧可以在“LOCOCO:低复杂度角探测器”中找到