В каком порядке HoughLines OpenCV перечисляет обнаруженные линии в матрице [rho,theta]?

Когда данное изображение со строками передается в преобразование HoughLine OpenCV, оно возвращает список пар rho и theta, каждая пара определяет отдельную линию. В каком порядке перечислены строки в этом списке тхета-пар.

Например, когда это изображение с 8 строками использовалось в Python, изображение с 8 строками

затем тета-матрица была возвращена для восьми строк.

[[ 461.            1.48352981]
 [ 380.            1.48352981]
 [ 212.            1.48352981]
 [ 112.            1.48352981]
 [  65.            1.48352981]
 [ 334.            1.48352981]
 [ 269.            1.48352981]
 [ 508.            1.48352981]]

Как порядок, в котором строки перечислены здесь в этой матрице, определяется openCV?

2 ответа

Решение

Из исходного кода OpenCV https://github.com/opencv/opencv/blob/master/modules/imgproc/src/hough.cpp

Функция HoughLinesStandard реализует стандартное преобразование Хафа, начиная со строки 80.

Если прокрутить немного дальше вниз (строка 166), мы найдем:

 // stage 3. sort the detected lines by accumulator value
    std::sort(_sort_buf.begin(), _sort_buf.end(), hough_cmp_gt(accum));

Теперь список строк отсортирован по возрастанию по значению аккумулятора. И лучший linesMax результаты помещаются в выходной буфер.

 // stage 4. store the first min(total,linesMax) lines to the output buffer
    linesMax = std::min(linesMax, (int)_sort_buf.size());
    double scale = 1./(numrho+2);
    for( i = 0; i < linesMax; i++ )
    {
        LinePolar line;
        int idx = _sort_buf[i];
        int n = cvFloor(idx*scale) - 1;
        int r = idx - (n+1)*(numrho+2) - 1;
        line.rho = (r - (numrho - 1)*0.5f) * rho;
        line.angle = static_cast<float>(min_theta) + n * theta;
        lines.push_back(Vec2f(line.rho, line.angle));

Если вы не знаете, каково значение аккумулятора, пожалуйста, прочитайте, как работает преобразование Хафа. https://en.wikipedia.org/wiki/Hough_transform

В основном, это говорит о том, сколько пикселей внесено в эту тета-пару.

Возможно, они возвращаются в лексикографическом (r, Θ) или (Θ, r) порядке, поэтому параллельные линии будут возникать либо путем увеличения расстояния от начала координат, либо случайным образом (порядок углов непредсказуем).

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

Если вам нужен конкретный заказ, вы можете указать и выполнить его. Например, сортируя по возрастанию r, стараясь назначить отрицательный знак, когда Θ сделал пол-оборота. Вы также можете отсортировать ординаты пересечений по вертикали.


После обнаружения Пятачка, они возвращаются силой. Мой предыдущий абзац все еще применяется.

Другие вопросы по тегам