Matlab detectCheckerboardPoints不完美

时间:2016-12-09 15:58:09

标签: matlab opencv camera-calibration corner-detection extrinsic-parameters

我最近使用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

  4. 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(下面的代码)检测到的角非常精确:
    2. // 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

3 个答案:

答案 0 :(得分:5)

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

  1. 每个棋盘方块有更多像素,因此角点检测算法可以找到更好的
  2. 您可以更好地纠正失真。相机失真在图像的角落处更强,因此如果棋盘在图像周围有点,那么如果图像中间只是一个小的东西,它会更好地检测到失真。

答案 1 :(得分:2)

你最好制作一个白色边缘大于正方形尺寸的较大棋盘,但如果你坚持使用这些图像,用油漆编辑它们并将一半最外面的黑色正方形和一些棋盘周围的区域。它有助于获得更好的检测,对进一步的计算没有不良影响。我希望它有效。

答案 2 :(得分:0)

也许您应该考虑删除校准中的异常值以获得更好的结果(我的意思是,校准时的错误百分比是多少?是否可以接受?)。消除扭曲后,也请尝试锐化图像。因为似乎未失真图像的分辨率已经大大降低,并且可能会导致错误。