,使用 cv2.HoughLinesP
函数检测图像中的直线。该函数的返回值 lines
是一个二维数组,其中每一行代表检测到的一条直线。
lines = cv2.HoughLinesP(edges, 1, 1.0 * np.pi / 180, 230, minLineLength=180, maxLineGap=5)
参数说明:
edges
:边缘检测后的图像。1
:累加器的单元大小,表示每个单元的像素数。1.0 * np.pi / 180
:角度的精度,这里设置为1度。230
:累加器阈值,只有当累加器超过这个值时,才认为检测到直线。minLineLength
:直线的最小长度。maxLineGap
:直线之间的最大间隔。
返回值 lines
的结构:
lines
是一个形状为(N, 4)
的二维数组,其中N
是检测到的直线数量。- 每一行包含一条直线的两个端点的坐标
((x1, y1), (x2, y2))
。
关于结果的解释:
print(lines)
:打印出所有检测到的直线信息。print(type(lines))
:确认lines
是一个numpy.ndarray
类型的对象。print(len(lines))
:打印出检测到的直线数量,即lines
中的行数。print(lines[0])
:打印出第一条直线的端点坐标。
如果 len(lines)
的值是 9,这意味着检测到了 9 条直线。然而,需要注意的是,并非所有检测到的直线都是有意义的,有些可能是错误的检测或者是图像中的噪声导致的。通常,您可能需要进一步处理这些直线,比如通过可视化、去除重复直线或根据直线的方向、长度进行筛选等。
可视化直线:
您可以使用 cv2.line
函数将检测到的直线绘制到图像上,以便于观察:
img_with_lines = cv2.imread('1.jpg')
for i in range(len(lines)):
rho, theta = lines[i][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(img_with_lines, (x1, y1), (x2, y2), (0, 0, 255), 1)
cv2.imshow("Lines", img_with_lines)
cv2.waitKey()
cv2.destroyAllWindows()