opencv - 使用 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);
解决方案
把它写下来作为自己的笔记,并分享我的经验。
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() 函数也无法工作。
推荐阅读
- android - Android gradle plugin v3.3.0 -> 使用 proguard 时找不到 R$raw
- 3d - 如何根据 x 和 y 位置手动旋转 3D 球体?
- java - 不使用 BufferedOutputStream 写入文件
- overriding - ExtJs 6.2.1 经典约束来自 RoweditPlugin 的 POST 功能
- azure-devops - Azure Service Fabric 部署错误:连接终结点上指定的端口“-1”与默认客户端连接终结点不匹配
- java - 抛出异常时缺少错误响应主体 @Around("@RequestMapping")
- keras - 使用 keras-flow-from-dataframe 生成器训练大型数据集
- javascript - this.setState 在我的“validate(e)”方法中不起作用
- ajax - 通过 ASP.NET Core 中的 PayPal API 进行付款
- java - 提交到 servlet 后如何在当前 JSP 页面中显示消息?