¿Se puede proporcionar un código de implementación de muestra o un puntero para implementar LSD con opencv 3.0 y python? HoughLines y HoughLinesP no están dando los resultados deseados en Python y quieren probar LSD en Python, pero no estoy llegando a ninguna parte.

He intentado hacer lo siguiente:

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

Sin embargo, cuando dibujo líneas en la máscara, aparece un error que es: LSD.drawSegments (mask, lines_std) TypeError: las líneas no son una tupla numérica

¿Puede alguien ayudarme con esto? Gracias por adelantado.

8
user1996684 26 dic. 2016 a las 13:15

3 respuestas

La mejor respuesta

Puede usar la función cv2.drawSegments de esta manera:

#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)

Puede consultar OpenCV documentación.

13
Flayn 16 ene. 2017 a las 14:51

La respuesta aceptada funciona bien si todo lo que busca es dibujar las líneas. Sin embargo, si desea un control de grano más fino sobre las líneas y su dibujo, puede recorrer las líneas y tratarlas individualmente como se sugiere. Solo una versión más limpia sería:

mask = np.zeros((img.shape),np.uint8)
lsd = cv2.createLineSegmentDetector(0)
lines = lsd.detect(img)[0]
for l in lines:
    x0, y0, x1, y1 = l.flatten()
    //do whatever and plot using:
    cv2.line(mask, (x0, y0), (x1,y1), 255, 1, cv2.LINE_AA)
0
Jovan Jovancevic 29 oct. 2018 a las 13:03

Pude dibujar las líneas en OpenCV 3.2.0 con lo siguiente:

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)

No estoy seguro de por qué toda la indirección [0] adicional, pero eso parece ser lo que se necesita para extraer las coordenadas.

Al desempacar los retornos de OpenCV, me ha resultado útil imprimirlo en la consola. En este caso, hice

print(dlines)

De todos los corchetes anidados, a menudo puedo encontrar una solución sin tener que preocuparme demasiado por qué y por qué.

Anteriormente había usado una versión DLL de Windows de LSD que compilé de la fuente de los autores y llamé con ctypes.

4
R. Strickland 14 ene. 2017 a las 15:36