相机标定findCirclesGrid参数设置与选择

相机标定findCirclesGrid参数设置与选择

利用对称的园盘格标定相机一般就会用到findCirclesGrid这个函数。如下图

相机标定findCirclesGrid参数设置与选择
虽然从找点到标定opencv都提供了现成的函数,但是参数的设置上还是得注意。
findCirclesGrid一般这么调用
std::vector<cv::Point2f> p;
cv::Size s;
s.height = 6;
s.width = 9;
found1 = findCirclesGrid(img, s, p, CALIB_CB_SYMMETRIC_GRID | CALIB_CB_CLUSTERING, detector);
CALIB_CB_SYMMETRIC_GRID
CALIB_CB_ASYMMETRIC_GRID
CALIB_CB_CLUSTERING

对于对称的圆盘,一般先使用CALIB_CB_SYMMETRIC_GRID | CALIB_CB_CLUSTERING若是发现很多错点,就使用CALIB_CB_SYMMETRIC_GRID 即可。

函数中的detector是自定义的斑点检测器

SimpleBlobDetector::Params params;
cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params);

这是默认的检测器,params可以设置很多的参数来改变检测器

    thresholdStep = 10;
    minThreshold = 50;
    maxThreshold = 220;

    minRepeatability = 2;

    minDistBetweenBlobs = 10;

    filterByColor = true;
    blobColor = 0;

    filterByArea = true;
    minArea = 25;
    maxArea = 5000;

    filterByCircularity = false;
    minCircularity = 0.8f;

    maxCircularity = std::numeric_limits<float>::max();

    filterByInertia = true;

    minInertiaRatio = 0.1f;
    maxInertiaRatio = std::numeric_limits<float>::max();

    filterByConvexity = true;

    minConvexity = 0.95f;
    maxConvexity = std::numeric_limits<float>::max();

如我们想告诉检测器最小的斑点的面积:

params.filterByArea = true;
params.minArea = 10;

在实际标定的过程中遇到了图片较小,斑点间间隔比较小,用默认的检测器会存在有斑点检测不出来,修改下面代码后顺利检出

params.minDistBetweenBlobs = 0;

总结
在标定时:
1、若检测的点混乱、重复,试着不用CALIB_CB_SYMMETRIC_GRID | CALIB_CB_CLUSTERING只用CALIB_CB_SYMMETRIC_GRID
2、对于图片小、点密的情况改变检测的最小间隔params.minDistBetweenBlobs = 0;

Original: https://blog.csdn.net/weixin_43151193/article/details/126666077
Author: 一眼半年
Title: 相机标定findCirclesGrid参数设置与选择

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/702586/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球