opencv中findChessboardCorners()的结果不一致

时间:2012-06-21 22:27:31

标签: c++ image-processing opencv

我正在用OpenCV编写C ++代码,我试图在图像上检测棋盘(从.jpg文件加载)以扭曲图像的视角。当findChessboardCorners()找到棋盘时,我的其余代码工作正常。但有时函数不会检测到模式,这种行为似乎是随机的。

例如,有一个图像可以使用它的原始分辨率2560x1920,但是如果我将其缩小到GIMP首先是800x600。然而,另一个图像似乎正好相反:原始分辨率不起作用,但缩小了工作量。

以下是执行检测的代码:

Mat grayimg = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
if (img.data == NULL) {
    printf("Unable to read image");
    return 0;
}
bool patternfound = findChessboardCorners(grayimg, patternsize, corners,
        CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_FAST_CHECK);
if (!patternfound) {
    printf("Chessboard not found");
    return 0;
}

opencv中是否存在某种导致此行为的错误?有没有人有关于如何预处理图像的任何提示,因此该功能将更加一致?

我已经尝试过使用参数CALIB_CB_ADAPTIVE_THRESH,CALIB_CB_NORMALIZE_IMAGE,CALIB_CB_FILTER_QUADS和CALIB_CB_FAST_CHECK。当我传入彩色图像时,我也得到了相同的结果。

提前致谢

编辑:我正在使用OpenCV版本2.4.1

4 个答案:

答案 0 :(得分:1)

欢迎来到现实世界计算机视觉的乐趣: - )

您不发布任何图像,并且findChessboardCorners有点太高级别无法调试。我建议显示(以八度,或matlab,或更多的OpenCV代码)检测到的角落在图像顶部的位置,以查看是否有足够的检测到。如果没有,请尝试在图像上单独运行cvCornerHarris。

有时问题的原因是图像的过度颗粒感:尝试模糊只是一点点,看它是否有帮助。

答案 1 :(得分:1)

我很难让findChessboardCorners工作,直到我在棋盘周围添加了一个白色的边框。

我发现在最近的文件中暗示某处。

在添加边框之前,有时无法识别键盘,但每次都会使用白色边框。

答案 2 :(得分:1)

实际上,尝试删除CALIB_CB_FAST_CHECK选项,并尝试一下。

答案 3 :(得分:0)

CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_FAST_CHECK与CALIB_CB_ADAPTIVE_THRESH |不同CALIB_CB_FAST_CHECK,你应该使用| (二进制或)