【Python】【OpenCV】检测直线和圆

发布时间 2023-12-07 22:29:33作者: VanGoghpeng

 重新理解一下Canny方法:

参数:

  • image:输入的图像。
  • threshold1:第一个阈值,用于检测边缘的强度梯度的下限。
  • threshold2:第二个阈值,用于检测边缘的强度梯度的上限。
  • apertureSize:Sobel算子的大小,可选值为3、5、7,默认值为3。
  • L2gradient:一个布尔值,指示是否使用更精确的L2范数计算梯度幅值,默认值为False。

返回值:

  • edges:包含边缘的输出图像。它是一个二进制图像,其中白色像素表示检测到的边缘,黑色像素表示未检测到的边缘。

 

cv2.HoughLineP():

参数:

  • image:输入的二值图像,通常是经过边缘检测的结果。
  • rho:极径步长,表示以像素为单位的距离精度。一般情况下,使用1即可。
  • theta:极角步长,表示以弧度为单位的角度精度。一般情况下,使用np.pi/180即可。
  • threshold:直线投票阈值,只有当累积器中的值高于该阈值时,才会被认为是一条直线。
  • minLineLength:线段的最小长度。比这个长度短的线段不会被检测到。
  • maxLineGap:允许两条线段之间的最大间隔,小于该值则被视为一条线段。

返回值:

  • lines:检测到的直线的参数表示。它是一个包含直线的起点和终点坐标的数组,每个直线由四个浮点数(x1, y1, x2, y2)表示。

 

 1 import cv2
 2 import numpy as np
 3 
 4 img = cv2.imread('../images/lines.jpg')
 5 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 6 
 7 # 寻找边缘
 8 edges = cv2.Canny(gray, 50, 120)
 9 
10 # 寻找直线
11 lines = cv2.HoughLinesP(edges, rho=1,
12                         theta=np.pi/180.0,
13                         threshold=20,
14                         minLineLength=50,
15                         maxLineGap=5)
16 
17 # lines此时是一个三维数组
18 for line in lines:
19     # line此时即为二维数组,且只有一个元素(只包含一个一维数组)
20     x1, y1, x2, y2 = line[0]
21     cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
22 
23 cv2.imshow("edges", edges)
24 cv2.imshow("lines", img)
25 cv2.waitKey()
26 cv2.destroyAllWindows()