c - RobuSTLy 以亚像素精度找到图像 block 的局部最大值

标签 c opencv image-processing computer-vision slam

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

quad

其中f(x,y)是每个像素的角点显着性度量,类似于original paper上提出的FAST分数,但经过修改还可以提供非角像素的显着性测量。

最小二乘法:

z

z2

b

X

bhat

为估计参数。
我现在可以通过将梯度设为零来计算拟合二次方程的峰值位置,从而实现我最初的目标。

在某些极端情况下会出现此问题,其中局部峰值更接近窗口边缘,导致拟合残差较低,但峰值位于窗口之外的二次方。

示例:
拟合二次方程的角点显着性和轮廓:

enter image description here

3D 网格的显着性(蓝色)和拟合度(红色):

enter image description here

此示例的数值为(行优先排序):

[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/

相关文章:

java - 如何转换 byte[] -> uint8_t[] 而不产生 JNI 问题?

c++ - 我如何每秒仅处理 2 帧?如何退出 c 或 c++ 中的 while 循环?

python - OpenCV(4.0.0)Python错误: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.函数 'cv::binary_op'中的sameSize(*psrc1)

python - OpenCV - 应用霍夫线变换后裁剪图像

c - Alloca 实现

为裸机 ARM 正确编译 Rust 代码作为静态库和 x86_64 的二进制文件?

android - 将长整数数组从 C 返回到 Java

python - 如何使用drawcontours为给定坐标绘制徒手线?

c++ - 使用 CvMoments 计算 HU 矩时出错

matlab - 如何进行亲和/转换不同图像的图像配准