image-processing - Opencv FindCornerSubPix精度

标签 image-processing opencv computer-vision

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

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

sample image with detected corner

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

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

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

任何想法,如何让这个功能正常工作,为什么不,或者用什么代替?

如果有任何建议,我将不胜感激

Error graph

最佳答案

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

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

  • 为您生成高分辨率的输入图像,大 16 倍;
  • 在此 HR 图像中一次将您的目标移动 1 个像素;
  • 通过下采样生成测试图像(注意:如果您要进行残酷的下采样以避免 PSF,请首先应用适当的模糊函数,例如 aliasing)到正确的大小。

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

关于image-processing - Opencv FindCornerSubPix精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12102318/

相关文章:

image-processing - 减去两个图像时出现奇怪的问题

Python-OpenCV 查找矩形并裁剪图像

javascript - 半透明点上的附加颜色

python - typeerror参数 'image'必须为iplimage

c++ - 不必在 OpenCV 中复制 Mat 的最佳方法

python - cv2.videocapture 不适用于 Raspberry-pi

c - 查找图像的方向

opencv - 透视变换结果的线的条件

c++ - 在 OpenCV 中为 BRISK 设置参数

opencv - 我应该使用什么样的描述符来检测海豹幼崽?