【发布时间】:2014-12-14 17:44:33
【问题描述】:
我正在尝试优化我的 Harris 角点检测器,以使其足够快,以进行最终将用于 SLAM 应用程序的实时特征提取。
传统的哈里斯角检测器遵循以下步骤:
- 使用图像卷积核(k_dx 和 k_dy)计算图像导数(梯度)Ix 和 Iy。
- 计算二阶导数 Ixx = Ix^2、Iyy = Iy^2 和 Ixy = Ix*Iy。
- 使用高斯核 (k_gaussian) 过滤步骤 2 中的三个二阶导数。
- 使用文献中所述的公式计算 Harris 响应。
到目前为止一切顺利。我已经实施了上述步骤并有一个工作程序。但是我们知道卷积是一个交换代数,这意味着:
- f#g=g#f
- f#(g#h)=(f#g)#h
- f # (g + h) = (f # g) + (f # h)
- 常数 * (f # g) = (常数 * f) # g
其中 (#) 是卷积运算。
所以本质上我们可以组合各种内核以减少计算时间。
我希望利用这一点将步骤(1)中使用的图像梯度内核与步骤(3)中使用的高斯内核相结合,以减少计算时间。不幸的是,步骤 (2) 阻止我这样做,因为:
[(IM # k_dx)^2] # k_gaussian =! (IM # k_dx # k_gaussian)^2
其中 IM 是图像。所以这两个内核不能合并。
我的问题:有没有办法做到这一点,还是根本不可能?如果不可能,那么有没有办法计算出近似真实答案的组合内核。即使它的近似值很差,降低计算成本也可能是值得的。
如果您想知道,我已经在使用 CUDA 在 GPU 上执行图像卷积,并且角点检测器已经相当快了。但我需要进一步改进它,以便为剩余的 SLAM 算法分配更大的时间范围。
【问题讨论】:
-
已经有了很好的答案。我想到了两件事:(a) 选择一个针对 GPU/CUDA 优化的特征检测器。 (b) 过早优化。如果拐角检测器很快,如果你将速度加倍,你将获得多少?听起来它可能会从 5% 的时间变为 2.5% 的时间......
标签: algorithm computer-vision convolution corner-detection