我正在尝试优化我的harris角点检测器,以使其足够快的实时特征提取,最终将用于slam应用。
传统的harris角点检测器遵循以下步骤:
使用图像卷积核(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_u dx)^2]k_u高斯=!(IM#k#dx#k#高斯)^2
其中im是图像。所以这两个内核不能合并。
我的问题是:有办法做到这一点还是根本不可能?如果这是不可能的,那么有没有一种方法来计算组合的内核近似真实答案。即使它是一个差的近似,它可能是值得的,以降低计算成本。
如果你想知道的话,我已经在用CUDA在GPU上进行图像卷积了,而且角点检测器已经相当快了但我需要进一步改进它,以便为剩余的slam算法分配更大的时间段。
最佳答案
不能用卷积直接组合核。ixx=ix^2,iyy=iy^2和ixy=ix*iy不是通过卷积找到的(它不是线性的)。
优化的一些技巧可以在“LOCOCO:低复杂度角点检测器”中找到