我正在用 C 语言开发 SLAM 算法,并且已经实现了快速角点查找方法,该方法为我提供了图像中的一些强关键点。下一步是以亚像素精度获取关键点的中心,因此我在每个关键点周围提取一个 3x3 面片,并对二维二次方程进行最小二乘拟合:
其中f(x,y)是每个像素的角点显着性度量,类似于original paper上提出的FAST分数,但经过修改还可以提供非角像素的显着性测量。
最小二乘法:
与 为估计参数。
我现在可以通过将梯度设为零来计算拟合二次方程的峰值位置,从而实现我最初的目标。
在某些极端情况下会出现此问题,其中局部峰值更接近窗口边缘,导致拟合残差较低,但峰值位于窗口之外的二次方。
示例:
拟合二次方程的角点显着性和轮廓:
3D 网格的显着性(蓝色)和拟合度(红色):
此示例的数值为(行优先排序):
[336, 522, 483, 423, 539, 153, 221, 412, 234]
得到的子像素中心 (2.6, -17.1) 是错误的。
如何约束拟合以使中心位于窗口内?
我愿意接受寻找子像素峰值的替代方法。
最佳答案
显而易见的答案是拒绝离散最大值不在中心的 3x3(或 5x5,无论您使用什么)盒子。换句话说,仅使用二次近似来细化必须位于框内的最大值的位置。
更一般地说,在这种情况下,首先要问的问题不是“我如何限制我的模型拟合过程来硬塞这个边缘情况的解决方案?”,而是 “我的模型适用于这种边缘情况吗?”以及“这种边缘情况是否值得花时间,或者我可以忽略它吗?”
关于c - RobuSTLy 以亚像素精度找到图像 block 的局部最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61215439/