我可以将FindChessboardCorners函数用于小于15万像素的图像,例如2k x 1.5k。但是当我在DSLR的图像上使用它时,分辨率为3700x5300,它不起作用。
我尝试使用resize()直接缩小图像大小,然后就可以了。
显然,OpenCV源代码中存在一些硬编码或错误。
你能帮我解决一下,还是指点一个补丁?
我发现有人在2006年发布了类似的问题,here,所以看起来问题仍然存在。
我使用的代码就像
found = findChessboardCorners( viewGray, boardSize, ptvec,
CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK);
更新
就在这里澄清一下。我认为该算法适用于较大的图像分辨率,但当棋盘占据较大比例的图像时,它会失败。 例如,当我在相同的相机位置使用50mm固定镜头时,FindChessboardCorners永远不会失败。将其更改为100mm固定镜头后,该功能开始停止检测图案。我认为这与比例或焦距有关。
下图是100mm镜头效果。
更新2
我为大图片添加了锐化滤镜,它开始解决问题。
首先我用
//do a sharpen filter for the large resolution image
if (viewGray.cols > 1500)
{
Mat temp ;
GaussianBlur(viewGray,temp, Size(0,0), 105) ; //hardcoded filter size, to be tested on 50 mm lens
addWeighted(viewGray, 1.8, temp, -0.8,0,viewGray) ; //hardcoded weight, to be tested.
//imwrite("test"+ imageList[k][i], viewGray) ;
}
found = findChessboardCorners( viewGray, boardSize, ptvec,
CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK);
上传了图片
原始分辨率为3744 x 5616的jpg图像,如果此网站强制转换,请确保您使用的是正确的分辨率。
答案 0 :(得分:24)
几点。
答案 1 :(得分:1)
如果您有权访问OpenCV源并可以重建它,那么您可以调试cvFindChessboardCorners
的行为。
您必须#define
DEBUG_CHESSBOARD
,然后您将有一些帮助来理解算法。
我认为OpenCV 2.4具有此功能(例如参见https://github.com/Itseez/opencv/blob/2.4/modules/calib3d/src/calibinit.cpp)。
此外,即使它似乎不适用于您的情况,OpenCV doc也要求校准目标:
注意:该功能需要在电路板周围的白色空间(如方形厚边框,越宽越好)进行检测 在各种环境中更加强大。否则,如果没有边框 并且背景是黑暗的,外部的黑色方块不能 正确分割等方形分组和排序算法 失败。
问题中的棋盘对于行(6个角)和列(8个角)都有偶数个内角,而reference OpenCV chessboard 具有偶数/奇数个角,即它是9x6,我不知道这可能是个问题。