2012-06-21 96 views
2

我正在用OpenCV编写C++代码,我试图检测图像上的棋盘(从.jpg文件加载)以扭曲图像的视角。当findChessboardCorners()发现棋盘时,我的其他代码完美地工作。但是有时函数不会检测到模式,而且这种行为似乎是随机的。在opencv中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

回答

1

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

你没有张贴任何图片,并且findChessboardCorners有点太高级调试。我建议显示(以八度,或matlab,或更多的OpenCV代码)在图像顶部检测到的角落的位置,看看是否检测到足够的。如果没有,请尝试在图像上自行运行cvCornerHarris。

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

1

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

我发现在更新的文档中提示某处。

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

1

其实,尝试删除CALIB_CB_FAST_CHECK选项,并试一试。

0

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