我正在用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
答案 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,你应该使用| (二进制或)