Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 亚像素精度图像块局部最大值的鲁棒搜索_C_Opencv_Image Processing_Computer Vision_Slam - Fatal编程技术网

C 亚像素精度图像块局部最大值的鲁棒搜索

C 亚像素精度图像块局部最大值的鲁棒搜索,c,opencv,image-processing,computer-vision,slam,C,Opencv,Image Processing,Computer Vision,Slam,我正在用C语言开发一个SLAM算法,并且我已经实现了快速角点查找方法,该方法为我提供了图像中的一些关键点。下一步是以亚像素精度获得关键点的中心,因此我在每个关键点周围提取一个3x3面片,并对二维二次曲线进行最小二乘拟合: 其中,fx,y是每个像素的角显著性度量,类似于上建议的FAST分数,但经过修改以在非角像素中也提供显著性度量 最小二乘法: 作为估计参数。 我现在可以计算拟合二次曲线的峰值位置,通过将梯度取为零,实现我最初的目标 该问题出现在一些角点情况下,其中局部峰值更接近窗口边缘,导致拟合

我正在用C语言开发一个SLAM算法,并且我已经实现了快速角点查找方法,该方法为我提供了图像中的一些关键点。下一步是以亚像素精度获得关键点的中心,因此我在每个关键点周围提取一个3x3面片,并对二维二次曲线进行最小二乘拟合:

其中,fx,y是每个像素的角显著性度量,类似于上建议的FAST分数,但经过修改以在非角像素中也提供显著性度量

最小二乘法:

作为估计参数。 我现在可以计算拟合二次曲线的峰值位置,通过将梯度取为零,实现我最初的目标

该问题出现在一些角点情况下,其中局部峰值更接近窗口边缘,导致拟合残差较低,但在窗口外出现二次型峰值

例如: 拟合二次曲线的角显著性和轮廓:

显著性蓝色和拟合红色作为三维网格:

此示例的数值按行主顺序排列:

[336, 522, 483, 423, 539, 153, 221, 412, 234]
得到的亚像素中心2.6,-17.1是错误的

如何约束拟合,使中心位于窗口内?
我对寻找亚像素峰值的其他方法持开放态度。

显而易见的答案是拒绝3x3或5x5,无论您使用的是离散最大值不在中心的框。换句话说,仅使用二次近似来优化必须位于框内的最大值的位置

更一般地说,在这种情况下,首先要问的问题不是如何约束模型拟合过程,以便为这种边缘情况找到解决方案,而是
我的模型是否适用于此edge案例?这个边缘案例是否值得花费时间,或者我可以忽略它吗?

显而易见的答案是拒绝3x3或5x5,无论您使用的盒子离散最大值不在中心。换句话说,仅使用二次近似来优化必须位于框内的最大值的位置

更一般地说,在这种情况下,首先要问的问题不是如何约束模型拟合过程,以便为这种边缘情况找到解决方案,而是
我的模型是否适用于此edge案例?这个边缘情况是否值得花费时间,或者我可以忽略它吗?

我尝试了自己的代码,使用稳定的最小二乘解算算法,将二维二次函数拟合到3x3值,还发现了域外的最大值。3x3数据块与二次函数不匹配,因此拟合没有用处

将二维二次曲线拟合到3x3邻域需要数据具有一定程度的平滑度,而您的快速输出中似乎没有这种平滑度

还有许多其他方法可以找到最大值的亚像素位置。我喜欢的一个方法是拟合一个可分离的二次函数,因为它更稳定,计算量更小。简言之,将二次函数拟合到一个维度中局部最大值周围的三个值,然后在另一个维度中拟合另一个值。这不是用9个值求解6个参数,而是用3个值求解3个参数,两次。只要中心像素大于或等于4连通邻域中的所有像素,该解决方案就可以保证稳定

z1 = [f(-1,0), f(0,0), f(1,0)]^T

    [1,-1,0]
X = [0,0,0]
    [1,1,0]

solve: X b1 = z1


现在从b1得到质心的x坐标,从b2得到y坐标。

我用自己的代码,使用稳定的最小二乘求解算法,将2D二次函数拟合到3x3值,还发现了域外的最大值。3x3数据块与二次函数不匹配,因此拟合没有用处

将二维二次曲线拟合到3x3邻域需要数据具有一定程度的平滑度,而您的快速输出中似乎没有这种平滑度

还有许多其他方法可以找到最大值的亚像素位置。我喜欢的一个方法是拟合一个可分离的二次函数,因为它更稳定,计算量更小。简言之,将二次函数拟合到一个维度中局部最大值周围的三个值,然后在另一个维度中拟合另一个值。这不是用9个值求解6个参数,而是用3个值求解3个参数,两次。只要中心像素大于或等于4连通邻域中的所有像素,该解决方案就可以保证稳定

z1 = [f(-1,0), f(0,0), f(1,0)]^T

    [1,-1,0]
X = [0,0,0]
    [1,1,0]

solve: X b1 = z1


现在,您可以从b1获得质心的x坐标,从b2获得y坐标。

仔细检查您的计算,拟合是可疑的。您好@YvesDaoust,谢谢您的回复。我用合成数据测试了拟合度,它的表现似乎与预期相符。可能还有其他想法吗?你能提供这九个值吗?拟合错误是因为你的逆矩阵不稳定吗?你试过用奇异值分解法解方程吗

ition?@YvesDaoust这些值是[336,522,483,423,539,153,221,412,234]行主调,但我想这是不相关的。仔细检查你的计算,拟合是可疑的。嗨@YvesDaoust,谢谢你的回答。我用合成数据测试了拟合度,它的表现似乎与预期相符。可能还有其他想法吗?你能提供这九个值吗?拟合错误是因为你的逆矩阵不稳定吗?你试过用奇异值分解法解这个方程吗?@YvesDaoust这些值是[336,522,483,423,539,153,221,412,234]行,但我想那是不相关的。我明白你的意思,但我相信我应该开发一个解决方案来处理这样的情况,因为局部最大值在3x3区域。例如,我想到了一个解决方案,它的成本是x0,y0到1,1的距离,但不幸的是,我负担不起计算优化算法。一定有什么把戏让我无法理解。。谢谢你的回答我明白你的意思,但我相信我应该开发一个解决方案来处理这样的情况,因为本地最大值在3x3区域。例如,我想到了一个解决方案,它的成本是x0,y0到1,1的距离,但不幸的是,我负担不起计算优化算法。一定有什么把戏让我无法理解。。谢谢你的回答。那当然是个好主意。虽然这样会丢弃窗口中四个未使用像素上的信息,但我不确定这会产生什么影响。在你看来,对对角线重复这个过程,并将中心作为两点的平均值会更好吗?Thanks@Bobisnotyouruncle:你当然可以试试。请记住,对于对角线,像素之间的距离是sqrt2,而不是1。因为这些距离更大,你可能想考虑一个加权平均值,其中对角线的结果比主轴的结果小一点。@ Bobisnotyouruncle:尽管亚像素精度很重要,但你可能需要考虑一个能产生平滑输出的角点检测器。FAST使用各种丑陋的过滤内核,导致输出不平滑。对导数使用适当的高斯滤波可以得到平滑的输出,其中插值实际上是有意义的,并且每个3x3面片都可以由2D二次曲面正确建模。谢谢,我会尝试一下。使用FAST的原因是计算能力的极大限制,我的想法是,亚像素方法应该基于FAST显著性分数,因为这是一个对社区中心像素更高的度量,这当然是一个好主意。虽然这样会丢弃窗口中四个未使用像素上的信息,但我不确定这会产生什么影响。在你看来,对对角线重复这个过程,并将中心作为两点的平均值会更好吗?Thanks@Bobisnotyouruncle:你当然可以试试。请记住,对于对角线,像素之间的距离是sqrt2,而不是1。因为这些距离更大,你可能想考虑一个加权平均值,其中对角线的结果比主轴的结果小一点。@ Bobisnotyouruncle:尽管亚像素精度很重要,但你可能需要考虑一个能产生平滑输出的角点检测器。FAST使用各种丑陋的过滤内核,导致输出不平滑。对导数使用适当的高斯滤波可以得到平滑的输出,其中插值实际上是有意义的,并且每个3x3面片都可以由2D二次曲面正确建模。谢谢,我会尝试一下。使用FAST的原因是计算能力的极限,我的想法是,亚像素方法应该基于FAST显著性分数,因为这是邻域中心像素更高的度量