gpt4 book ai didi

c++ - opencv c++ 找到轮廓的内接圆

转载 作者:搜寻专家 更新时间:2023-10-30 23:51:45 51 4
gpt4 key购买 nike

我想求轮廓的最大内切圆

我用 cv::findContours 检测到轮廓它以vector<Point>的形式存在.

我知道如何检测最小外接圆 ( cv::minEnclosingCircle ),但不知道如何获得最大外接圆。如何做到这一点?

问题2:如何得到以质心为中心的内接圆和外接圆?


为了澄清,我尝试描述这些圆圈的含义:

  1. min enclosing circle:从外部接触物体,中心位置无关紧要,最小面积。
  2. 外接圆:从外部接触物体,中心位置在物体的质心上,最小面积。
  3. 最大闭合圆:从内部接触物体,中心位置无关紧要,最大面积。
  4. 内切圆:从内部接触物体,中心位置在物体的质心上,最大面积。

最佳答案

您可以:

1) 从你的轮廓创建一个面具

enter image description here

2) 计算掩码上的distanceTransform

enter image description here

3) 最大值为半径,其位置为圆心

enter image description here

代码:

#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;
}

关于c++ - opencv c++ 找到轮廓的内接圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53646022/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com