Matlab的detectCheckerboardPoints缺陷

问题描述 投票:1回答:3

我最近使用MATLAB单相机校准应用算法来校准相机内在和外部参数。在发现棋盘的角落,多次detectCheckerboardPoints Matlab的出执行(精度)OpenCV的API cv::findChessboardCorners,功能又上了一些照片,Matlab的行为奇怪。

例如,下面的图像中,板之间的广场角落清晰可见,而MATLAB发现在陌生的地方多余的:

  1. 原始图像://应该有5 * 8 = 40个内的角点enter image description here
  2. 的失真的图像上发现的角点:// 6 * 9 = 54发现enter image description here
  3. 在原始图像上发现点:// 6 * 10 = 60 ... enter image description here

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

enter image description here

matlab opencv camera-calibration corner-detection extrinsic-parameters
3个回答
5
投票

使棋盘还大!这可能发生,它发生。一般情况下,你想有一个棋盘是大多数屏幕的一部分。您解决两个问题:

  1. 有每平方棋盘更多的像素,因此眼角检测算法能更好地找到它
  2. 您纠正扭曲越好。相机失真图像的角落强,因此如果棋盘有围绕图像的所有点,它会检​​测失真相当好,然后如果只是在图像中间的小东西。

2
投票

你最好带白边比正方形的面积较大更大的棋盘,但如果你坚持使用该图片,用油漆和最外面的黑色方块的美白一半,周围的一些棋盘面积的编辑。它有助于有一个更好的检测与上进一步计算无不良影响。我希望它的作品。


0
投票

也许你应该考虑在校准消除异常值有更好的效果(我的意思是当你校准误差百分比?是可以接受?)。也可以尝试摆脱失真后锐化图像。因为它似乎是不失真的图像的分辨率已经显著下降,这可能会导致错误。

© www.soinside.com 2019 - 2024. All rights reserved.