find4QuadCornerSubpix vs cornerSubPix

时间:2019-07-13 09:50:16

标签: opencv subpixel

我无法找到有关find4QuadCornerSubpix()函数的任何信息。我试图了解find4QuadCornerSubpix()和cornerSubPix()之间的区别。

有人可以帮助我吗?

谢谢

1 个答案:

答案 0 :(得分:1)

TLDR;使用cornerSubPix,find4QuadCornerSubpix未完成

  • cornerSubPix 使用求解器在遮罩区域 (winSize) 内找到鞍点(一阶导数为零,二阶导数正在改变符号)。请注意, findChessboardCorners 将使用一个 2x2 的小窗口执行一个cornerSubPix 调用,因此您已经获得了一些亚像素精度的坐标。
  • find4QuadCornerSubpix 尝试近似分隔棋盘格字段(“四边形”)的线并返回这些线的交叉点。 find4Quad 函数也仅使用每个提供的输入点(例如来自 findChessboardCorners)周围的屏蔽区域(“region_size”)。

我使用这些 abs 用人工生成的图像(添加低噪声,无失真,大多数四边形边缘长度约为 100pxl)测试了两个角的改进。以像素为单位测量的差异:

  1. rms 0.0537 最大值 0.1963; cv::findChessboardCorners(没有额外的参考):
  2. rms 0.0368 最大 0.0969; (1) + 11x11 角子像素;与 ocv 教程中的参数相同
  3. rms 0.2230 最大 1.2619; (1) + 11x11 find4QuadCornerSubpix(图像二值化 w. 自适应 Thr。)

我测试了 3x3, 11x11, 50x50, 100x100, 150x150 并输入了二值化 w 的图像。自适应阈值;结果都一样。

我选择了一些真实世界的例子,其中内在校准对于类似于 (2) 的东西具有大约 0.08 的重投影 rms。对于 (3) 他们有 0.25 像素的 reproj。女士。

所以目前(opencv 4.5.1 版)对我来说 find4QuadCornerSubpix 看起来未完成且无法使用。 0.5 的 rms 是我在没有任何子像素改进的情况下预期的最大误差。如果任何输入坐标比 region_size/2

更接近图像边界,该函数也会失败

来源: https://github.com/opencv/opencv/blob/fc1a15626226609babd128e043cf7c4e32f567ca/modules/imgproc/src/cornersubpix.cpp https://github.com/opencv/opencv/blob/fc1a15626226609babd128e043cf7c4e32f567ca/modules/calib3d/src/quadsubpix.cpp https://github.com/opencv/opencv/blob/b450dd7a87bc69997a8417d94bdfb87427a9fe62/modules/calib3d/src/calibinit.cpp https://github.com/opencv/opencv/blob/b19f8603843ac63274379c9e36331db6d4917001/samples/cpp/tutorial_code/calib3d/camera_calibration/camera_calibration.cpp