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

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

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

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

[[ 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?


person Pranjal Agarwal    schedule 15.12.2017    source источник


Ответы (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

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

person Piglet    schedule 15.12.2017
comment
Я провел простой тест на порядок возвращаемых строк. Сначала он дает более длинные строки. Это должно быть потому, что функция сортировки использует hough_cmp_gt. - person Kanat; 29.01.2021

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

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

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


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

person Yves Daoust    schedule 15.12.2017