首页 > 解决方案 > 使用 findcirclesgrid() 查找带角度的非对称圆网格时,该函数不起作用

问题描述

分辨率是2592*1944,网格几乎填满了图像,那么问题就出来了。当板子与镜头平行时,我可以找到网格,就像那样 在此处输入图像描述

当板子有角度时,该功能不起作用: 在此处输入图像描述

真诚地寻求帮助,谢谢。

这是我的代码。

SimpleBlobDetector::Params params;
params.maxArea = 30000;
params.minInertiaRatio = 0.05f;
Ptr<FeatureDetector> blobDetector = new SimpleBlobDetector(params);
bool found = findCirclesGrid(circleimg, Size(cbCols, cbRows), corners, CALIB_CB_ASYMMETRIC_GRID, blobDetector);

标签: opencv

解决方案


把它写下来作为自己的笔记,并分享我的经验。

Mat circleimg = imread("circle.bmp");
SimpleBlobDetector::Params params;
params.maxArea = 30000;
params.minArea = 1000;
params.minThreshold = 10;
params.maxThreshold = 180;
params.thresholdStep = 5;
params.filterByCircularity = true;
params.minCircularity = 0.7;
params.filterByInertia = false;
params.filterByConvexity = false;
Ptr<FeatureDetector> blobDetector = new SimpleBlobDetector(params);

//this part can be used to test the if the blob detector work.
vector<KeyPoint> keypoints;
blobDetector->detect(circleimg, keypoints);
Mat circleimg_tmp = circleimg.clone();
for (size_t i = 0; i < keypoints.size(); i++)
{
    circle(circleimg_tmp, keypoints[i].pt, 25, Scalar(0, 0, 255), 3);
}
namedWindow("circleimg", cv::WINDOW_NORMAL);
imshow("circleimg", circleimg_tmp);
waitKey(0);

bool found = findCirclesGrid(circleimg, Size(cbCols, cbRows), corners, CALIB_CB_ASYMMETRIC_GRID | CALIB_CB_CLUSTERING, blobDetector);
drawChessboardCorners(circleimg, Size(cbCols, cbRows), corners, found);
imshow("circleimg", circleimg);

我发现了一个问题,即使 blobdetector 找到了圆,当我不使用聚类标志时, findcirclesgrid() 函数也无法工作。


推荐阅读