Какова конкретная реализация вероятностного преобразования Хафа в OpenCV?

Кто-нибудь знает конкретный алгоритм вероятностного преобразования Хафа в реализации OpenCV? Я имею в виду, есть ли справочный документ или документация об алгоритме?

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

Благодарю вас!

-Джин


person galactica    schedule 30.11.2010    source источник


Ответы (5)


Вот статья о рандомизированном преобразовании Хафа, которое, как я считаю, совпадает с «вероятностным преобразованием Хафа», используемым в OpenCV http://en.wikipedia.org/wiki/Randomized_Hough_Transform

по сути, вы не заполняете аккумулятор для всех точек, а выбираете набор точек с определенными критериями для заполнения преобразования Хафа.

Следствием этого является то, что иногда вы могли пропустить настоящую линию, если не было достаточно очков для начала. Я предполагаю, что вы захотите использовать это, если у вас несколько линейные структуры, так что большинство точек будут избыточными. ссылка № 2: Л. Сюй, Э. Оджа и П. Култанан, «Новый метод обнаружения кривой: рандомизированное преобразование Хафа (RHT)», Pattern Recog. лат. 11, 1990, 331-338.

Я также читал о некоторых довольно разных подходах, когда алгоритмы берут две точки и вычисляют точку посередине этих двух точек. если точка является краевой, то мы будем накапливать бин для этой линии. Это, по-видимому, очень быстро, но вы предполагаете несколько неразреженную матрицу, поскольку вы можете легко пропустить строки, если для начала не будет достаточно краевых точек.

person Denis    schedule 14.12.2010
comment
очень полезные комментарии! Спасибо! Я не смотрел на линии рандомизированных подходов, скорее, я думал, что это должно быть что-то вроде вероятностного преобразования Хафа или около того. - person galactica; 15.12.2010
comment
Рандомизированное преобразование Хафа отличается от прогрессивного вероятностного преобразования Хафа. Первый принимает наборы случайных точек, которые отображаются в отдельные ячейки в пространстве Хафа. Он делает это итеративно, и линии/плоскости обнаруживаются, как только ячейка аккумулятора пересекает пороговое значение. Последний имеет механизм фильтрации для избавления от шума, учитывая процент голосов от общего числа голосов, которые голосуют за ячейку. См.: Трехмерное преобразование Хафа для обнаружения плоскостей в облаках точек: обзор и новый дизайн накопителя, автор Borrmann et al. (2011) - person Anne van Rossum; 02.05.2013
comment
Не понимаю, почему это принятый ответ? Это имеет мало общего с реализацией OpenCV, которая, как упоминалось выше, реализует прогрессивное вероятностное преобразование Хафа, а не рандомизированное преобразование Хафа. - person Dr.D.; 21.03.2014

В документации OpenCV говорится, что алгоритм основан на «Надежном обнаружении линий с использованием прогрессивного вероятностного преобразования Хафа», разработанного J Matas et al. Это сильно отличается от RHT, описанного в Википедии.

Статья не находится в свободном доступе в Интернете, но вы можете приобрести ее у Elsevier.

person vas    schedule 03.06.2011

Исходный код для HoughLinesProbabilistic в OpenCV 2.4.4 содержит встроенные комментарии, объясняющие различные этапы.

https://github.com/Itseez/opencv/blob/master/modules/imgproc/src/hough.cpp

person Drew Noakes    schedule 17.03.2013
comment
Пожалуйста, используйте постоянные ссылки, когда вы ссылаетесь на GitHub. Этот файл изменился с тех пор, как вы разместили эту ссылку, и поэтому номер строки теперь не имеет значения. GitHub не упрощает задачу; вы можете нажать y в представлении файла, чтобы получить постоянную ссылку. - person bfontaine; 30.10.2016

Статья Обнаружение линий с помощью преобразования Хафа в разделе 6 может быть полезным.

person tOnIp    schedule 09.11.2012
comment
Спасибо за эту статью. Я нахожу это очень полезным. - person Drew Noakes; 23.02.2013

Вот довольно краткая статья Матаса и др. который описывает подход, и, как уже упоминалось, он действительно сильно отличается от рандомизированного преобразования Хафа:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.40.2186&rep=rep1&type=pdf

(Хотя не уверен, как долго эта ссылка будет действительна. Она находится на / из citeseer, не ожидала, что она просто исчезнет завтра, но кто знает...)

Я бегло просмотрел реализацию icvHoughLinesProbabilistic() в hough.cpp, потому что я буду ее использовать :-) В любом случае, она кажется довольно простой, мой основной интерес заключался в том, выполняет ли она подгонку строк методом наименьших квадратов в конце - это нет, что хорошо. Это просто означает, что если требуется получить точные сегменты линии, можно использовать начальную/конечную точку и подразумеваемые параметры линии, возвращаемые OpenCV, для выбора связанных точек из общего набора точек. Я бы в первую очередь использовал довольно консервативный порог расстояния и запускал RANSAC/MSAC в этих точках с меньшим порогом. Наконец, поместите строку в набор inlier, как обычно, например. используя cvFitLine() OpenCV.

person Dr.D.    schedule 20.03.2014