Matlab detectCheckerboardPoints不完美

zha*_*hen 1 matlab opencv camera-calibration extrinsic-parameters corner-detection

我最近使用Matlab 单摄像机校准应用程序算法来校准相机内在函数和外在函数.在找到棋盘的角落时,很多时候detectCheckerboardPointsMatlab的功能执行(准确性)opencv api cv::findChessboardCorners,但在某些图片上,Matlab表现得很奇怪.

例如,在下图中,可以清楚看到棋盘方块之间的角落,而matlab在奇怪的地方找到了多余的角落:

  1. 原始图像://应该有5*8 = 40个内角点 在此输入图像描述

  2. 在未失真的图像上找到角点:// 6*9 = 54找到 在此输入图像描述

  3. 在原始图像上找到的点:// 6*10 = 60 ... 在此输入图像描述

matlab代码片段很简单,如下所示:

img=imread(fn);
[imUndist, newOrig]=undistortImage(img, cameraParams);
[pxs, bdsize]=detectCheckerboardPoints(imUndist); %or detect on 'img' directly
imMarked=insertMarker(imUndist, pxs);
imshow(imMarked);
Run Code Online (Sandbox Code Playgroud)
  1. opencv在此图像上检测到(下面的代码)的角非常精确:

// opencv代码:

Mat img = imread(fpath);
int ww = 8, hh = 15;
cv::Size bsz(ww, hh);
vector<Point2f> ptvec;
bool found = cv::findChessboardCorners(img, bsz, ptvec, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE);
cv::drawChessboardCorners(img, bsz, ptvec, found);
imshow("img", img);
waitKey();
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

And*_*uri 5

让棋盘更大!这可能发生,而且确实发生了.通常,您希望棋盘格成为大部分屏幕的一部分.你解决了两个问题:

  1. 每个棋盘方块有更多的像素,因此角点检测算法可以更好地找到它
  2. 你可以更好地纠正失真.相机失真在图像的角落处更强,因此如果棋盘在图像周围具有点,则它将比图像中间的小物体更好地检测失真.