【问题标题】:Find biggest circle fitting between points in 2D找到二维点之间的最大圆拟合
【发布时间】:2021-05-17 14:11:27
【问题描述】:

我想知道是否有一个函数,最好是在 openCV 中,找到适合点集的最大圆。也许是某种圈增长算法。

我有什么:

std::vector<std::vector<Point> > contours;
cv::findContours(binary,contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
cv::minEnclosingCircle(cnts[0],res_center,res_radius);
Mat backtorgb;
cv::cvtColor(binary,backtorgb,cv::COLOR_GRAY2RGB);
cv::circle(backtorgb,res_center,res_radius,Scalar(0,0,255),2);

但这或多或少像一个缩小的圆圈(红色)。我需要一个正在成长的(绿色)。

我想要什么:

原文:

【问题讨论】:

标签: opencv image-processing


【解决方案1】:

@beaker 为我指出了正确的解决方案。

我必须添加洪水填充并调整 distanceTransform 参数。 为了完整起见,调整后的代码:

cv::Mat img = cv::imread("original.png", IMREAD_GRAYSCALE);
cv::Mat im_floodfill = binary.clone();
cv::floodFill(im_floodfill, cv::Point(0,0), Scalar(255));
cv::Mat inv=Mat(im_floodfill.size(), im_floodfill.type());
cv::bitwise_not(im_floodfill,inv);
cv::Mat1f dt;
cv::distanceTransform(inv, dt, cv::DIST_L2, DIST_MASK_PRECISE,cv::DIST_LABEL_PIXEL);
double max_val;
cv::Point max_loc;
cv::minMaxLoc(dt, nullptr, &max_val, nullptr, &max_loc);
cv::Mat3b out;
cv::cvtColor(img, out, cv::COLOR_GRAY2BGR);
cv::circle(out, max_loc, max_val, cv::Scalar(0, 255, 0));

结果:

【讨论】:

    猜你喜欢
    • 2019-03-19
    • 2018-06-01
    • 1970-01-01
    • 2021-02-27
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多