2

我正在使用 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

4 回答 4

2

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

我在最近的文档中发现了这一点。

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

于 2012-07-18T18:08:40.927 回答
1

实际上,请尝试删除 CALIB_CB_FAST_CHECK 选项,然后尝试一下。

于 2012-08-13T01:22:54.110 回答
1

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

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

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

于 2012-06-22T12:19:57.233 回答
0

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

于 2015-07-28T14:17:48.640 回答