19

我可以将 FindChessboardCorners 函数用于小于 15 兆像素的图像,例如 2k x 1.5k。但是,当我在 DSLR 的图像上使用它时,分辨率为 3700x5300,它不起作用。

我尝试使用 resize() 直接减小图像大小,然后就可以了。

显然,OpenCV 源代码中有一些硬编码或错误。

你能帮我弄清楚,或者给我一个补丁吗?

我发现有人在 2006 年在这里发布了类似的问题,所以看起来问题仍然存在。

我使用的代码就像

found = findChessboardCorners( viewGray, boardSize, ptvec,
                                CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK);

更新

只是在这里澄清一下。我认为该算法适用于大图像分辨率,但当棋​​盘占据图像的较大比例时它会失败。例如,当我在同一相机位置使用 50mm 固定镜头时,FindChessboardCorners 永远不会失败。在我将其更改为 100mm 固定镜头后,该功能开始停止检测图案。我认为这与比例或焦距有关。

下图是 100mm 镜头的结果。

更新 2

我为大图像添加了锐化滤镜,它开始解决问题。

首先我用

//do a sharpen filter for the large resolution image
if (viewGray.cols > 1500)
{
  Mat temp ;
  GaussianBlur(viewGray,temp, Size(0,0), 105) ; //hardcoded filter size, to be tested on 50 mm lens
  addWeighted(viewGray, 1.8, temp, -0.8,0,viewGray) ; //hardcoded weight, to be tested.
//imwrite("test"+ imageList[k][i], viewGray) ;

}

found = findChessboardCorners( viewGray, boardSize, ptvec,
CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK);

上传图片:

原始分辨率为 3744 x 5616 的 jpg 图像,如果此站点强制转换,请确保您使用正确的分辨率。

原始分辨率为 3744 x 5616 的 jpg 图像,如果此站点强制转换,请确保您使用正确的分辨率。

4

2 回答 2

32

几点。

  1. 正如您所注意到的,缩小尺寸有助于检测器。这是因为 OpenCV 中用于查找角点的角点检测过滤器具有固定大小,并且卷积掩码的大小可能太小而无法检测到角点 - 在该比例下,全尺寸图像实际上可能看起来“平滑”,特别是稍微模糊的地方。但是,通过缩小比例,您会丢掉一些角落位置的准确性。
  2. 出于同样的原因,锐化也有帮助。然而,它也违背了准确性,因为它会增加角落的子像素位置的偏差——即使在没有噪声的理想情况下也是如此。为了让自己相信这种情况,请考虑 1D 模拟:拐角处的图像强度(在 1D 中,清晰的黑白过渡)在理想情况下看起来像 sigmoid 曲线(具有平滑拐角的斜坡),并且您想要找到其拐点的位置。锐化使曲线更陡峭,这通常会移动该点的位置。当您考虑到锐化通常会放大噪音时,情况会变得更糟。
  3. 可能的正确方法是从较低的分辨率开始(即缩小尺寸),然后放大由此找到的角的位置,并将它们用作在全分辨率下运行 cvFindCornersSubpix 的初始估计。
于 2013-02-25T19:22:59.867 回答
1

如果您可以访问 OpenCV 源并且可以重建它,那么也许您可以调试cvFindChessboardCorners.

您必须这样做#define DEBUG_CHESSBOARD,然后您将对理解算法有所帮助。

我认为 OpenCV 2.4 具有这种能力(例如参见https://github.com/Itseez/opencv/blob/2.4/modules/calib3d/src/calibinit.cpp)。

此外,即使它似乎不适用于您的情况,OpenCV 文档也对校准目标提出了要求:

注意:该功能需要在电路板周围留有空白(如方形粗边框,越宽越好),以使检测在各种环境中更加稳健。否则,如果没有边框且背景较暗,则无法正确分割外部黑色方块,因此方块分组和排序算法失败。

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findchessboardcorners

问题中的棋盘对于行(6 个角)和列(8 个角)都有偶数个内角,而参考 OpenCV 棋盘 在此处输入图像描述有偶数/奇数个角,即 9x6,我不知道这是否可能是个问题。

于 2013-11-21T20:54:56.190 回答