我正在使用 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
最佳答案
我很难让 findChessboardCorners 正常工作,直到我在棋盘周围添加了一个白边框。
我在最近的文档中发现了这一点。
在添加边框之前,有时无法识别键盘,但使用白色边框后每次都能正常工作。
关于c++ - opencv 中 findChessboardCorners() 的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11147721/