1

我最近使用 Matlab Single Camera Calibration App算法来校准相机的内在和外在。在找到棋盘的角落时,Matlab 的功能多次detectCheckerboardPoints执行(准确度)opencv api cv::findChessboardCorners,但在某些图片上,Matlab 的行为很奇怪。

例如,在下图中,棋盘格之间的角清晰可见,而 matlab 在奇怪的地方发现多余的角:

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

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

  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);
  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();

在此处输入图像描述

4

3 回答 3

5

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

  1. 每个棋盘格的像素更多,因此角点检测算法可以更好地找到它
  2. 您可以更好地校正失真。图像角落处的相机失真更强,因此如果棋盘格在图像周围都有点,它会比图像中间的一个小东西更好地检测到失真。
于 2016-12-09T16:02:00.057 回答
2

您最好制作一个更大的棋盘,其白边距大于正方形的大小,但如果您坚持使用此图像,请使用 Paint 编辑它们并将最外面的黑色正方形的一半和棋盘周围的一些区域变白。它有助于进行更好的检测,而不会对进一步的计算产生不良影响。我希望它有效。

于 2016-12-15T12:08:50.493 回答
0

也许您应该考虑在校准中去除异常值以获得更好的结果(我的意思是您校准时的错误百分比是多少?可以接受吗?)。在消除失真后,还可以尝试锐化图像。因为似乎未失真图像的分辨率已显着下降,这可能会导致错误。

于 2019-02-06T07:15:25.823 回答