OpenCV HoughCircles, обнаруживающие только 1 круг - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь обнаружить, локализовать и собрать синий мрамор. Цель моего проекта - обнаружить только 1 мрамор за раз. Для моего обнаружения я использую функцию HoughCircles из OpenCV. Я хотел бы, чтобы код давал мне позиции X и Y только для первого обнаруженного круга.

Это код, который я использую для этого:

vector<Vec3f> circles;
HoughCircles(OutputImage, circles, HOUGH_GRADIENT, 1,
    OutputImage.rows / rows,      //change to detect circles that are closer to eachother
    para1, para2, minRad, maxRad);        //chang last to parameters to detect larger or smaller circles


for (size_t i = 0; i < circles.size(); i++)
{
    Vec3i c = circles[i];
    Point center = Point(c[0], c[1]);
    // circle center
    circle(imgHSV, center, 1, Scalar(0, 255, 0), 3, LINE_AA);
    // circle outline
    int radius = c[2];
    circle(imgHSV, center, radius, Scalar(255, 0, 0), 3, LINE_AA);

    cout << "The center of the detection is located at pixel: " << Point(c[0], c[1]) << endl;

    x = c[0];
    y = c[1];


}

Однако это все еще обнаруживает все круги и распечатайте X, Y информацию для всех кругов. Я попытался изменить circles.size() на 1 в for l oop, но это дает мне следующую ошибку: Выражение: векторный индекс находится вне диапазона

Может ли кто-нибудь здесь быть в состоянии чтобы помочь мне, это мое первое приложение OpenCV, так что извините, если я неправильно понимаю.

Если вам нужен мой полный код, не стесняйтесь спрашивать.

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Метод HoughCircles дает вам все найденные круги:

Чтобы получить доступ к «первому» кругу, вы должны сделать:

if(circles.size() > 0) {
    Vec3i c = circles.at(0);
    Point center = Point(c[0], c[1]);
    // circle center
    circle(imgHSV, center, 1, Scalar(0, 255, 0), 3, LINE_AA);
    // circle outline
    int radius = c[2];
    circle(imgHSV, center, radius, Scalar(255, 0, 0), 3, LINE_AA);

    cout << "The center of the detection is located at pixel: " << Point(c[0], c[1]) << endl;

    x = c[0];
    y = c[1];
}

Но ваш вопрос мне кажется, что вы не понимаю код C ++, который вы написали ...

0 голосов
/ 22 апреля 2020

Ну, круги будут содержать сколько кругов найдет HoughCircles (). Что может быть> = 0.

Формула {} l oop проходит по кругу и сообщает подробности для каждого из них. По сути, вы можете либо сломаться; из л oop. то есть

for (size_t i = 0; i < circles.size(); i++)
{
     ...
     break; /// i think this works in c++
}

или замените на l oop для простой условной проверки

if (circles.size() > 0)
{
   Vec3i c = circles[0];
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...