2016-12-26 662 views
0

可以通过opencv 3.0和python提供一个示例实现代码或指针来实现LSD吗? HoughLines和HoughLinesP在python中没有给出想要的结果,并且想要在python中测试LSD,但是没有获得任何地方。Opencv 3中的LineSegmentDetector与Python

我试图做到以下几点:

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

然而,当我画的掩膜线我得到一个错误是: LSD.drawSegments(面具,lines_std)类型错误:行不一个数字元组

有人可以帮我这个吗? 在此先感谢。

回答

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

你可以应用一个过滤器来删除所有低于10px的行 – 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) 

从所有的嵌套的方括号的,我经常可以制定出一个解决方案,而不必担心的原因和它的所有因此太多。

我以前使用过一个Windows DLL版本的LSD,我从作者的源代码编译并用ctypes调用。

+0

这是一个很好的手工解决方案,但LSD具有drawSegment功能。 – Flayn