2016-12-26 3 views
0

Может ли быть представлен пример кода реализации или указателя для реализации LSD с opencv 3.0 и python? HoughLines и HoughLinesP не дают желаемых результатов в python и хотят тестировать LSD в python, но я не получаю нигде.LineSegmentDetector в Opencv 3 с Python

Я попытался сделать следующее:

LSD=cv2.createLineSegmentDetector(0) lines_std=LSD.detect(mixChl) LSD.drawSegments(mask,lines_std)

Однако, когда я рисовать линии на маске я получаю ошибку, которая: LSD.drawSegments (маска, lines_std) TypeError: линии не является числовой кортеж

Может кто-нибудь, пожалуйста, помогите мне с этим? Спасибо заранее.

ответ

2

Вы можете использовать cv2.drawSegments функцию:

#Read gray image 
img = cv2.imread("test.png",0) 

#Create default parametrization LSD 
lsd = cv2.createLineSegmentDetector(0) 

#Detect lines in the image 
lines = lsd.detect(img)[0] #Position 0 of the returned tuple are the detected lines 

#Draw detected lines in the image 
drawn_img = lsd.drawSegments(img,lines) 

#Show image 
cv2.imshow("LSD",drawn_img) 
cv2.waitKey(0) 

Вы можете проверить OpenCV documentation.

+0

Насколько вам известно, вы знаете содержимое 'lsd.detect (img) [1]'? Являются ли они дескрипторами? – eshirima

+0

Итак, если я хочу отправить ширину обнаруженных строк в функцию, она не вернет линии, ширина которых равна или больше, но она вернула все строки? lines = lsd.detect (warped, 10, 10), так вы знаете, как обнаружить только линии, ширина которых больше определенной ширины? – sara

+0

Вы можете применить фильтр для удаления всех строк ниже 10 пикселей – Flayn

3

я смог рисовать линии в OpenCV 3.2.0 со следующим:

lsd = cv2.createLineSegmentDetector(0) 
dlines = lsd.detect(gray_image) 
    for dline in dlines[0]: 
    x0 = int(round(dline[0][0])) 
    y0 = int(round(dline[0][1])) 
    x1 = int(round(dline[0][2])) 
    y1 = int(round(dline[0][3])) 
    cv2.line(mask, (x0, y0), (x1,y1), 255, 1, cv2.LINE_AA) 

Я не знаю, почему все дополнительные [0] косвенности, но это, кажется, что он принимает извлеките координаты.

При распаковке OpenCV, я нашел полезным только распечатать вещь на консоли. В этом случае, я сделал

print(dlines) 

Из всех вложенных в квадратные скобки, я часто выработать решение без необходимости слишком беспокоиться о том, почему и для чего все это.

Ранее я использовал версию LSD для Windows DLL, которую я скомпилировал из источника авторов и вызвал с помощью ctypes.

+0

Это хорошее ручное решение, но LSD имеет функцию drawSegment. – Flayn