2016-03-17 9 views
2

У меня вопрос о opencv libary HoughLines. Формат ниже с официального сайта:Opencv HoughLines Lines Theta?

C++: пустота HoughLines (InputArray изображение, OutputArray линии, двойной Rho, двойной тета, внутр порог, двойной СРН = 0, двойная STN = 0)

И объяснение выходного массива параметров линий, он говорит:

lines - Выходной вектор линий. Каждая строка представлена ​​двухэлементным вектором: rho и theta. и тета равна 0 для вертикальных линий и pi/2 для горизонтальных линий (в сиянии).

Мне интересно, что такое принцип тета? Кажется, что theta находится в диапазоне от 0 до 1,57 (поскольку pi/2 равно 1,57), но я запускаю код и обнаруживаю, что theta может превышать 1,57 и стать некоторым странным значением, как показано на рисунке ниже, красная линия - это обнаруженная line by HoughLines, а sita - значение в параметрических строках? enter image description here.

Может ли кто-нибудь сказать мне, что такое регулярность тета, которая выводится из строк?

Большое спасибо!

+0

Угол кажется правильным, считая от оси X против часовой стрелки или от Y ось по часовой стрелке. –

+0

Значит, вы имеете в виду, что противоположная линия может иметь ту же самую тету? – HenryChen

+0

Тета не связана с интервалом [0, PI/2], она просто указывает направление, в котором измеряется угол. Как сказал @AlexanderEkzhanov, угол измеряется против часовой стрелки, начиная с оси x, что дает вам значение PI/2 для вертикальных линий. Это не означает, что Тета не может превышать эту величину. – s1h

ответ

1

Это то, что я понял. Угол, который я думал, что ваша консоль должна показывать, - оранжевый (около -0,72 рад). Но похоже, что OpenCV использует положительный угол для всех параллельных линий для вашей линии. Я имею в виду фиолетовый угол, который показывает ваша консоль (около 2,5 рад). Таким образом, ваша линия имеет эту тету и ро (расстояние до линии) - отрицательное значение. Это потому, что ваша линия лежит на правой стороне начала координат. (Я нарисовал картинку в Paint, извините, если это не очень)

enter image description here

+0

Большое спасибо Канату. – HenryChen

+0

Так что, похоже, строки opencv не могут точно определить направление линии? – HenryChen

+0

Я не уверен, что все строки opencv, @HenryChen. В этом конкретном случае тета не показывает угол линии. Он показывает угол между осью х и перпендикулярно линии по часовой стрелке. – Kanat

5

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

cv2.HoughLines дает вам пары (r, theta), которые сопоставляются строкам. Theta - это угол против часовой стрелки между осью x (изображения) и линией. Он равен нулю и pi. Rho - это «расстояние» от верхнего левого изображения к линии. Как указывает OP, rho часто является отрицательным и, следовательно, не является надлежащим расстоянием. Вот что сделали авторы OpenCV:

Если theta < pi/2, мы говорим о линии, которая идет от левого нижнего края изображения в верхнем правом углу. В этом случае он не может пересекать ось x ниже 0, и мы точно знаем линию для рисования (с учетом rho). До этого момента документы OpenCV являются правильными.

Если theta> pi/2, нам нужно устранить двусмысленность между двумя параллельными линиями, которые равноудалены от начала координат. Чтобы справиться с этим, авторы HoughLines создали правило: , если тета> pi/2, линии, проходящие через левую часть изображения, имеют положительный rho, а линии, проходящие через верхнюю часть изображения, имеют отрицательное значение rho.

+1

Это сработало, спасибо! – Carpetfizz

0

Rho - это размер «ковша» или аккумуляторной решетки для всего входящего rho или расстояния от источника. Самое длинное расстояние в изображении от верхнего левого до нижнего правого, поэтому для максимальной точности подключите это значение к houghlines rho. Theta - размер ведра для всех входящих тета. Для максимальной точности вам нужно значение 180. Для того, чтобы обнаруживать четные углы, тета должна быть равна 90. Чтобы определять только углы, делящиеся на 30, тета должна быть 6

Смежные вопросы