我可以将 FindChessboardCorners 函数用于小于 15 兆像素的图像,例如 2k x 1.5k。但是,当我在 DSLR 的图像上使用它时,分辨率为 3700x5300,它不起作用。
我尝试使用 resize() 直接减小图像大小,然后就可以了。
显然,OpenCV 源代码中有一些硬编码或错误。
你能帮我弄清楚,或者给我一个补丁吗?
我发现有人在 2006 年在这里发布了类似的问题,所以看起来问题仍然存在。
我使用的代码就像
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 图像,如果此站点强制转换,请确保您使用正确的分辨率。