2014-02-20 5 views
3

Я в настоящее время пытаюсь обнаружить горизонтальные подобные линии в изображении с помощью функции HoughLinesP в OpenCV, используя следующие параметры:Как использовать HoughLinesP для определения горизонтальных линий в OpenCV?

HoughLinesP(linMat[i], lines, 1, CV_PI/180, 80, linMat[i].cols*(0.3), 3);

где linMat[i] является входным изображением. В результате, как этот

http://postimg.org/image/49b8wzlgz/

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

http://postimg.org/image/rh9wlueo7/

Я пытался изменить параметр CV_PI/180 с меньшим значением (например, как CV_PI/45), а также попытаться использовать различные значения для других параметров, но горизонтальная линия не может быть сгенерирована.

Какие значения должны использоваться в параметрах для создания такой желтой линии с использованием функции HoughLinesP в opencv?

Спасибо!

Update

После предложений (спасибо всем!) Я пытался даже очень экстремальные значения, как

HoughLinesP(linMat[i], lines, 1, CV_PI/360, 80, 1, 1);

, тем не менее, приведенные линии имеют наклон в ближайшем вертикальном направлении, так как это : postimg.org/image/y5w6vm7lx/ (скопируйте-вставьте ссылку ...). Я не использую фильтр обнаружения края, например, canny, так как он не смог обнаружить более толстые линии, края, как правило, были прекращены.

Обновление 2

Просто для уточнения, линии, сделанные в результате образуются следующим образом (после HoughLinesP)

for all lines

{

line(linMat[i], Point(lines[j][0], lines[j][1]), Point(lines[j][2], lines[j][3]), Scalar(0,0,255), 1, 8);

}

ответ

2

Попробуйте применить Hough на изображениях с краями изображения canny или любого другого алгоритма, чем запустить его на пороговом изображении.

enter image description here

Это может быть видно, что более высокие значения тета будут представлять только горизонтальные значения. Отфильтруйте результаты, полученные в lines, исключив значения с низкими значениями тета.

+0

Если вы установили theta в PI, вы получите почти как раз вертикальные линии. PI/3, похоже, работает одинаково. Но PI/6 возвращает все направления. Я не разобрался в деталях, почему он работает таким образом, но изменение тэта на тестовом изображении может дать вам указания. –

1

Из того, что я могу прочитать в документации (link), я думаю, что функция HoughLinesPобнаружит все линии в изображении.Параметры - это только пороговые значения, влияющие на чувствительность обнаружения.

Так что, если вы хотите только горизонтальные линии, просто отфильтруйте остальные, проанализировав выходной массив. Поскольку каждый элемент выходного вектора представляет собой 4-элементный вектор (x_1, y_1, x_2, y_2), вы можете вычислить наклон линии и использовать ее для фильтрации не горизонтальных линий.

2

Просто использовать уравнение

double Angle = atan2(y2 - y1, x2 - x1) * 180.0/CV_PI; 

Проверьте угол для каждой линии, обнаруженной HoughLinesP(), и рассмотрим линии, имеет угол 0 или 180.

+0

Как я уже упоминал в обновленном вопросе, кажется, что независимо от того, насколько сильно меняю угол, приведенные линии всегда имеют вертикальный наклон. Может ли это быть ограничением функции HoughLinesP для такого случая? – Houari

1

Вы можете просто попробовать:

for all lines: 
    if abs(lines[j][1] - lines[j][3]) == 0: 
    # Horizontal line 

Кроме того, если ваши линии наклонены, вы можете попробовать:

for all lines: 
    if abs(lines[j][1] - lines[j][3]) < 20: # Tune this parameter 
    # Horizontal line 

Я думаю, вы поняли!

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