在OpenCV HoughLines中检测多条线

在OpenCV HoughLines中检测多条线,opencv,Opencv,我正在使用OpenCV 4.4并运行以下代码来检测网格线。当我显示图像时,它总是检测到一行,如屏幕截图所示。如何检测网格中的所有垂直线 grid = cv2.imread('images/grid.jpeg') grayscale = cv2.cvtColor(grid, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(grayscale, 50, 150, apertureSize=3) lines = cv2.HoughLines(edges, 1, np.pi

我正在使用OpenCV 4.4并运行以下代码来检测网格线。当我显示图像时,它总是检测到一行,如屏幕截图所示。如何检测网格中的所有垂直线

grid = cv2.imread('images/grid.jpeg')

grayscale = cv2.cvtColor(grid, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(grayscale, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi/180, 100)

for rho, theta in lines[0]:
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))
    cv2.line(grid, (x1, y1), (x2, y2), (255, 0, 0), 2)

cv2.imshow("Lines", grid)
cv2.waitKey(0)
cv2.destroyAllWindows()

原始图像:

您可以使用
lineDetector
算法

  • 按照@Mika的建议,找到图像的边缘

  • img=cv2.imread(“lines.png”)
    img\u gry=cv2.CVT颜色(img,cv2.COLOR\u BGR2GRY灰色)
    img_cny=cv2.Canny(img_gry,50200)
    
  • 结果:


  • 要检测垂直边,x坐标之间的差值应接近0,因为只有y坐标在变化

    • 如果abs(x1-x2)<3:
      cv2.线(img,pt1=(x1,y1),pt2=(x2,y2),颜色=(0,0,255),厚度=3)
      
  • 结果:


代码:


导入cv2
img=cv2.imread(“lines.png”)
img\u gry=cv2.CVT颜色(img,cv2.COLOR\u BGR2GRY灰色)
img_cny=cv2.Canny(img_gry,50200)
lns=cv2.ximgproc.createFastLineDetector().detect(img_cny)
对于lns中的ln:
x1=int(ln[0][0])
y1=int(ln[0][1])
x2=int(ln[0][2])
y2=int(ln[0][3])
如果abs(x1-x2)<3:
cv2.线(img,pt1=(x1,y1),pt2=(x2,y2),颜色=(0,0,255),厚度=3)
cv2.imshow(“lns”,img)
cv2.等待键(0)

你能显示边缘图像吗?@Mika添加了原始图像。