Спасибо за редактирование. Я сделал подобные шаги. Вместо использования линий я использовал минимальную окружность окружности каждого контура, а затем минимум их всех. Но у меня все та же проблема: круг всегда немного больше контура (я использую C ++ - CLI). Может я использую неправильные параметры? Спасибо.

ользуюcv::minEnclosingCircle(...) чтобы получить минимальный круг, который точно развивает мой контур, но я получаю круг немного больше.

Другими словами, я пытаюсь получить что-то вроде этого:

https://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Simple_concave_polygon_Min_Enclosing_Circle.svg/441px-Simple_concave_polygon_Min_Enclosing_Circle.svg.png

Но я получаю это (круг):

Обратите внимание, что круг немного больше, чем предмет, который нужно заключить.

Мне нужно заключить объект в круг, а не в эллипс.

Заранее спасибо.

Это мой код:

cv::vector<cv::Point> allPixels;
    int columnas = img.cols, filas = img.rows;
    cv::Point pt;
    for(int col = 0; col < columnas; col++){
        for(int row = 0; row < filas; row++){

            int val = img.at<uchar>(row,col);

            if(val == 255){
                pt.x = col;
                pt.y = row;

                allPixels.push_back(pt);
            }
        }
    }

    cv::Mat dispImage = img.clone();
    cv::Point2f center;
    float radius;

    cv::minEnclosingCircle(allPixels,center,radius);

    cv::circle(dispImage,center,radius,cv::Scalar(128),1);
    cv::circle(dispImage,center,1,cv::Scalar(128),1);

    cv::imwrite("Enclosing_Result.png",dispImage);

С 'img' cv :: Mat с размером (760 760) и форматом CV_8UC1. Окончательный результат ("Enclosing_Result.png") следующий:

И моя цель заключается в следующем (нарисовано):

 areify23 нояб. 2017 г., 17:32
есть код, спасибо
 apple apple23 нояб. 2017 г., 15:42
Вы должны показать свой код.

Ответы на вопрос(1)

Мой результат в порядке.

1. только для одного региона
## only one region
cnts = cv2.findContours(threshed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]

(x,y), r = cv2.minEnclosingCircle(cnts[0])

2. для более чем одного региона
## more than one region
mask = threshed.copy()

## find centers 
for cnt in cnts:
    (x,y), r = cv2.minEnclosingCircle(cnt)
    pt = (int(x), int(y))
    centers.append(pt)

## connect the `centers`
for i in range(1, len(centers)):
    cv2.line(mask, centers[i-1], centers[i], 255, 2)

## find the center 
cnts = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
(x,y), r = cv2.minEnclosingCircle(cnts[0])

 areify24 нояб. 2017 г., 10:45
Спасибо за редактирование. Я сделал подобные шаги. Вместо использования линий я использовал минимальную окружность окружности каждого контура, а затем минимум их всех. Но у меня все та же проблема: круг всегда немного больше контура (я использую C ++ - CLI). Может я использую неправильные параметры? Спасибо.
 areify24 нояб. 2017 г., 09:32
Хорошо, а как насчет изображения с разными контурами? Я хочу получить что-то вроде этого:oi67.tinypic.com/296cghe.jpg
 Kinght 金24 нояб. 2017 г., 10:21
Вам нужно больше шагов для этого изображения: соедините «центры», затем выполнитеminEnclosingCircle очередной раз.
 Kinght 金24 нояб. 2017 г., 08:53
Да, у меня только тест, все в порядке.
 areify24 нояб. 2017 г., 08:52
Это Питон, не так ли?

Ваш ответ на вопрос