相机标定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/
转载文章受原作者版权保护。转载请注明原作者出处!