Спасибо за редактирование. Я сделал подобные шаги. Вместо использования линий я использовал минимальную окружность окружности каждого контура, а затем минимум их всех. Но у меня все та же проблема: круг всегда немного больше контура (я использую C ++ - CLI). Может я использую неправильные параметры? Спасибо.
ользуюcv::minEnclosingCircle(...)
чтобы получить минимальный круг, который точно развивает мой контур, но я получаю круг немного больше.
Другими словами, я пытаюсь получить что-то вроде этого:
Но я получаю это (круг):
Обратите внимание, что круг немного больше, чем предмет, который нужно заключить.
Мне нужно заключить объект в круг, а не в эллипс.
Заранее спасибо.
Это мой код:
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") следующий:
И моя цель заключается в следующем (нарисовано):