4

我需要以尽可能高的精度检测灰度图像上的角点。目前我正在使用 OpenCV 函数:cvFindCornerSubPix()。

我准备了一个简单的测试:得到一个带有黑/白边角的图像:

检测到角的示例图像

然后是一系列相同的对象,每个移动 1/16 像素。我确实手动检查了像素值,测试图像很好。

检测结果令人失望:即使在 TermCrit 中条件设置为 100 次迭代或 0.005 阈值,检测误差也高达 0.08 像素。

该图显示了作为像素内位置函数的误差。看起来一点也不随意。另一件值得注意的事情:对于角落的其他环形位置(当边缘不是水平/垂直时)结果更好,但仍然不完美。

有什么想法,如何使此功能正常工作,为什么不能正常工作,或者改用什么?

我将不胜感激任何建议

错误图

4

1 回答 1

0

不到 10% 的像素真的一点也不差。作为参考,适用于从卫星图像生成 3D 模型的相关峰值检测器将具有相同数量级的误差。

正如评论中所指出的,确切的错误模式将取决于您用于生成子像素模式的插值方法。为了避免高阶插值方法(超过 2 阶)引入的非单调性,我建议使用以下协议:

  • 生成高分辨率的输入图像,大 16 倍;
  • 在此 HR 图像中一次将目标移动 1 个像素;
  • 通过下采样来生成测试图像(小心:如果您为了避免锯齿而进行残酷的下采样,请先应用适当的模糊功能,如PSF)到正确的大小。

最后,通常不希望达到较小的误差幅度。亚像素角检测器设计用于检测到许多(通常在 20 到 100 个之间)点的图像中。然后将这些点用于稳健的估计过程,该过程应该去除异常值并对有效点集的误差进行平均。

于 2013-10-23T11:33:13.953 回答