我正在尝试优化我的 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 算法分配更大的时间范围。
最佳答案
直接组合内核来使用卷积是不可能的。 Ixx = Ix^2、Iyy = Iy^2 和 Ixy = Ix*Iy 不是通过卷积找到的(它不是线性的)。
一些优化技巧可以在“LOCOCO: LOW COMPLEXITY CORNER DETECTOR”中找到
关于algorithm - 优化哈里斯角点检测器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26453856/