У меня есть двоичное изображение, вычисленное по некоторым алгоритмам. На изображении есть дыра, и я хочу, чтобы в этой дыре лучше всего поместился круг. Я пытался с помощью bestminEnclosingCircle
функция, но это не дает лучших результатов.
Вот двоичное изображение
Вот что я получаю от этой функции
Вот что ожидалось
Я хочу исключить эту часть
Вот мой код для поиска контуров
vector<Vec4i> hierarchy;
vector<vector<Point> > contours;findContours(src, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
проверьте код ниже
#include "opencv2/imgcodecs.hpp"#include "opencv2/highgui.hpp"#include "opencv2/imgproc.hpp"#include <iostream>
using namespace cv;
using namespace std;int main(int, char** argv)
{
Mat src, src_gray;
/// Load source image and convert it to gray
src = imread("e:/test/ifFz9.png");
resize(src, src, Size(), 0.25, 0.25);
/// Convert image to gray and blur it
cvtColor(src, src_gray, COLOR_BGR2GRAY);
blur(src_gray, src_gray, Size(3, 3));
imshow("Source", src);
Mat threshold_output;
vector<vector<Point> > contours;
/// Detect edges using Threshold
threshold(src_gray, threshold_output, 127, 255, THRESH_BINARY);
/// Find contours
findContours(threshold_output, contours, RETR_TREE, CHAIN_APPROX_SIMPLE);
for (size_t i = 0; i < contours.size(); i++)
{
if (contours[i].size() > 50)
{
RotatedRect minEllipse = fitEllipse(contours[i]);
int size = min(minEllipse.size.width, minEllipse.size.height) / 2;
// ellipse
if (size < src.rows / 2)
ellipse(src, minEllipse.center, Size(size, size), 0, 360, 0, Scalar(0, 0, 0255), 2, 8);
}
}
imshow("Contours", src);
waitKey(0);
return 0;
}
Других решений пока нет …