algorithm - 优化哈里斯角点检测器

标签 algorithm computer-vision convolution corner-detection

我正在尝试优化我的 Harris 角点检测器,使其足够快以进行实时特征提取,最终将在 SLAM 应用中使用。

传统的哈里斯角点检测器遵循以下步骤:

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

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

  1. f# g = g # f
  2. f# (g # h) = (f# g) # h
  3. f# (g + h) = (f# g) + (f# h)
  4. 常数 * (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/

相关文章:

同步条目顺序的算法

python - 在 Python 中使用 OpenCV 消除切向透视失真

python - OpenCV 点目标检测未找到所有目标,发现圆圈偏移

python - 了解 NumPy 的卷积

python - 重用已知的排序操作对类似未排序的数据进行排序

基于多个可能的匹配匹配人的算法

algorithm - 在 Clojure 中将嵌套向量减少为另一个向量

matlab - 如何将此图像处理从 Matlab 转换为 OpenCV?

tensorflow - 与 keras 进行注意卷积

python - 使用 tf.nn.atrous_conv2d 将膨胀率单独应用于每个维度?