Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
Image processing Opencv FindCornerSubPix精度_Image Processing_Opencv_Computer Vision - Fatal编程技术网

Image processing Opencv FindCornerSubPix精度

Image processing Opencv FindCornerSubPix精度,image-processing,opencv,computer-vision,Image Processing,Opencv,Computer Vision,我需要以尽可能高的精度检测灰度图像上的角点。目前我正在使用OpenCV函数:cvFindCornerSubPix() 我准备了一个简单的测试:得到了一个带有黑白边角的图像: 然后是一系列相同的物体,每一个移动1/16像素。我手动检查了像素值,测试图像很好 检测结果令人失望: 即使在TermCrit中,条件设置为100次迭代或0.005阈值,检测误差也会达到0.08像素 该图将误差显示为像素内位置的函数。一点也不随机。另一件值得注意的事情是:对于角点的其他环形位置(当边不是水平/垂直时),结果更

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

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

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

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

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

有什么想法,如何使这个功能正常工作,为什么它不能,或者使用什么来代替

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


一个像素不足10%的性能其实并不差。作为参考,适用于从卫星图像生成三维模型的相关峰值检测器将具有相同的误差量级

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

  • 以16倍大的高分辨率生成输入图像
  • 在此HR图像中,每次移动目标1像素
  • 通过将下采样(小心:如果你为了避免错误的下采样,请像第一次一样应用适当的模糊功能)生成正确大小的测试图像

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

您确定移动1/16像素时这不是缩小尺寸的结果吗?@Martin是的,我是。后续图像中边缘上的像素值如下:(0,255),(16,239),(32,223),等等。您对转换后的图像使用哪种插值方法?尝试双线性和双三次曲线。这样可能会引入一些偏见。也可以尝试使用不是二的反幂的平移值。您可以在转换后的图像上手动验证(通过灰度值的线性插值)边缘是否处于理论上正确的位置。另外,尝试在初始化理论(真实)角点位置后运行迭代,看看它是否保持稳定。这是一个众所周知的插值伪影。从外观上看,您正在使用双线性插值。双线性插值很糟糕。如果你想要一个好的结果,你需要至少三次,甚至更高阶的核。看看这些书:生成图像的过程正是我使用的,错误不在模式生成中-它是在真实的检测中,噪声图像0.1像素可能不会太坏。。。但在完美的无噪图像中,我认为它应该仅受颜色深度(8位灰度中的1/256)的限制。实际应用应该是亚像素测量(非常精确校准的相机上的小位移)-因此,如果我在无噪图像上获得0.1的精度,那么在实际情况下可能会更糟,我没有检查opencv 2.2和更高版本,因为线程非常旧