Нахождение радиуса и крайних координатных точек окружностей (Hough Circle Transform)

Мне нужно найти крайние точки кругов на этом изображении (верхний левый угол, верхний правый угол, нижний левый угол и, наконец, нижний правый угол)

Изображение проходит пороговое значение, затем обнаруживает края перед наложением обратно на исходное изображение.

введите здесь описание изображения например (нарисовано краской)

введите здесь описание изображения

и соединить их вместе (нарисовать краской)

введите здесь описание изображения

введите здесь описание изображения

но как мне сначала получить радиус и координаты x и y из центра, а затем нарисовать линию?

for (int i = 0; i < circles.size(); i++)
{
    //icout << i<<"\n"<<endl;
    Point center(cvRound(circles[i][ 0]), cvRound(circles[i][1]));
    stringstream ss;
    ss << i + 1;
    putText(dst, ss.str(), center, 1, 1, Scalar(255, 0, 225 ), 2, 0);
    int radius = cvRound(circles[i][2]);
    // circle center
    circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);
    // circle outline
    circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0);
    //for original image overlap
    circle(dst, center, 3, Scalar(0, 255, 0), -1, 8, 0);
    // circle outline
    circle(dst, center, radius, Scalar(0, 255, 255), 3, 8, 0);


}

это демонстрационный код, но я изо всех сил пытаюсь понять круги .size () из

for (int i = 0; i < circles.size(); i++)

а также

Point center(cvRound(circles[i][ 0]), cvRound(circles[i][1]));

Я буду признателен, если вы объясните мне это более простым способом, поскольку я все еще нахожусь в процессе обучения, мне подойдет просто отправная точка для начала. Спасибо!


person Lyber    schedule 27.09.2016    source источник
comment
не совсем ответ на ваш вопрос, но может ли выпуклая оболочка всех кругов быть решением того, что вы изначально хотели? docs.opencv.org/2.4/doc/tutorials/ imgproc / shapedescriptors / hull /   -  person Micka    schedule 27.09.2016
comment
@Micka Да! Это именно то, что я ищу, за исключением того, что мне нужен план. Могу ли я изменить его цвет, чтобы я мог установить порог, чтобы получить только контур без внутренних контуров? Я не совсем уверен, что делает rng.uniform (0,255) и зачем ему 3 из них: l   -  person Lyber    schedule 28.09.2016
comment
попробуйте for( int i = 0; i< contours.size(); i++ ) { Scalar color = Scalar( 0, 0, 255 ); drawContours( drawing, hull, i, color, 1, 8, vector<Vec4i>(), 0, Point() ); } нарисовать полностью красным цветом только корпус. Код rng - это генератор случайных чисел, поэтому код учебника будет рисоваться случайным цветом!   -  person Micka    schedule 28.09.2016
comment
Важный код - `convxHull (Mat (contours [i]), hull [i], false);` он вычислит контур. Но предварительно вам нужно объединить все контуры вашего круга в один контур.   -  person Micka    schedule 28.09.2016
comment
Большое тебе спасибо. Я попробую объединить полученные круги в один контур, а затем снова воспользуюсь методом convxHull!   -  person Lyber    schedule 28.09.2016
comment
@Micka Вы имеете в виду группировку всего круга в контур, чтобы выпуклый корпус мог захватывать углы?   -  person Lyber    schedule 28.09.2016
comment
imho, достаточно отодвинуть назад все точки контура круга (или даже крайние точки упомянутых вами кругов), неупорядоченные до std :: vector ‹cv :: Point›, потому что упорядочение не требуется для вычисления выпуклой оболочки afaik.   -  person Micka    schedule 28.09.2016


Ответы (2)


Если вы посмотрите документ opencv на тему преобразования Круга, http://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html?highlight=houghcircles#houghcircles.

под переменной круги вы можете видеть, что это вектор, где каждый круг представляет собой 3 кортежа со значениями (x, y, радиус)

Итак, в вашем случае, чтобы получить данные круга i:

xCoordinate = круги [i] [0]

yCoordinate = круги [i] [1]

радиус = круги [i] [2]

circle.size (): количество найденных кругов.

После этого, чтобы найти нижнюю левую точку, например, просто найдите 6 точек с наименьшей координатой y и из этой группы найдите точку с наименьшей координатой x.

person Amitay Nachmani    schedule 27.09.2016
comment
Спасибо! Мне удалось получить координаты x и y, но что вы имеете в виду под 6 точками с самой низкой координатой y? - person Lyber; 28.09.2016
comment
создать вектор для всех y-координат кругов. Затем отсортируйте его (и получите индексы) и возьмите значения 6 кругов с наименьшей координатой y. Для этих кругов найдите круг с наименьшей координатой x. - person Amitay Nachmani; 28.09.2016
comment
Извините, я действительно медленно учусь, но пока я сначала создал вектор, а затем добавил координаты x и y в список внутри окружностей. Размер для вектора цикла ‹Point› данных; data.push_back (Point (круги [i] [0], круги [i] [1])); - person Lyber; 28.09.2016

Я думаю, вам нужно показать определение кругов, т.е.какого типа круги

похоже, это может быть vector<vector<int>> (или какая-то форма tuple<int>)

если я неправильно понимаю ваш вопрос circles.size() - это количество кругов, а не радиус круга (size()), являющийся функцией, которая возвращает количество элементов в векторе

внутренний vector<int>, кажется, хранит позицию x в [0] и позицию y в [1]

и радиус круга в [2]

person MyDeveloperDay    schedule 27.09.2016
comment
Спасибо! Удалось разобраться чуть получше :) - person Lyber; 28.09.2016