opencv c ++找到刻有轮廓的圆圈

Kem*_*dil 2 c++ geometry opencv find

我想找到最大的轮廓刻字圆.

我已经检测到轮廓cv::findContours并且它在那里作为a vector<Point>.

我知道如何检测最小的封闭圆(cv::minEnclosingCircle),但不知道如何获得最大的封闭圆.这该怎么做?

问题2:我如何获得以质心为中心的刻字和限定圆圈?


为了澄清,我试着用这些关注来描述我的意思:

  1. min circle circle:从外面触摸物体,中心位置无关紧要,最小面积.
  2. 外接圆:从外部触摸物体,物体中心位置,最小面积.
  3. 最大包围圈:从内侧触摸物体,中心位置无关紧要,最大面积.
  4. 刻字圆:从内部触摸物体,物体中心位置,最大面积.

Mik*_*iki 7

您可以:

1)从轮廓中创建一个蒙版

在此输入图像描述

2)计算distanceTransform面具上的

在此输入图像描述

3)最高值是半径,其位置是中心

在此输入图像描述

码:

#include <opencv2\opencv.hpp>

int main()
{
    // Load image
    cv::Mat1b img = cv::imread("path_to_img", cv::IMREAD_GRAYSCALE);

    // Correct image
    cv::Mat1b bin = img < 127;

    // Find contour
    std::vector<std::vector<cv::Point>> contours;
    cv::findContours(bin, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

    // Draw on mask
    cv::Mat1b mask(bin.rows, bin.cols, uchar(0));
    cv::drawContours(mask, contours, 0, cv::Scalar(255), cv::FILLED);

    // Distance Trasnsform
    cv::Mat1f dt;
    cv::distanceTransform(mask, dt, cv::DIST_L2, 5, cv::DIST_LABEL_PIXEL);

    // Find max value
    double max_val;
    cv::Point max_loc;
    cv::minMaxLoc(dt, nullptr, &max_val, nullptr, &max_loc);

    // Output image
    cv::Mat3b out;
    cv::cvtColor(img, out, cv::COLOR_GRAY2BGR);
    cv::circle(out, max_loc, max_val, cv::Scalar(0, 255, 0));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)