OpenCV 线检测
本教程将讨论在 Python 中使用 OpenCV 的 HoughLines()
和 HoughLinesP()
函数检测图像中的线条。
在 Python 中使用 OpenCV 的 HoughLines()
函数检测图像中的线条
OpenCV 的 HoughLines()
函数用于使用标准霍夫线变换检测图像中存在的线。
要检测图像中存在的线条,我们必须使用 imread()
函数读取图像,如果它还没有灰度,则将其转换为灰度。
之后,我们必须使用 OpenCV 的 Canny()
函数找到给定图像的边缘。Canny()
函数的第一个参数是给定的图像。
第二个和第三个参数是滞后过程的第一个和第二个阈值。第四个参数是光圈大小,第五个参数是梯度值。
Canny()
函数的输出根据阈值包含给定图像的边缘。我们必须通过 HoughLines()
函数内部的边缘来检测图像中存在的线条。
HoughLines()
函数的第一个参数是边缘检测器的输出,它应该是灰度图像。第二个参数是以像素为单位的参数分辨率。
第三个参数是以弧度为单位的参数分辨率。第四个参数是用作内联检测的最小交叉点数的阈值。
其他参数是默认参数。之后,我们必须使用 OpenCV 的 line()
函数使用循环在原始图像上一一绘制每一行。
之后,我们可以使用 OpenCV 的 imshow()
函数显示原始图像和检测到线条的图像。
例如,让我们检测数独图像中存在的线条。
请参阅下面的代码。
import cv2 as cv
import numpy as np
import math
src_img = cv.imread('test.png')
cv.imshow('Original Image',src_img)
dst_img = cv.Canny(src_img, 50, 200, None, 3)
lines = cv.HoughLines(dst_img, 1, np.pi / 180, 150, None, 0, 0)
for i in range(0, len(lines)):
rho_l = lines[i][0][0]
theta_l = lines[i][0][1]
a_l = math.cos(theta_l)
b_l = math.sin(theta_l)
x0_l = a_l * rho_l
y0_l = b_l * rho_l
pt1_l = (int(x0_l + 1000*(-b_l)), int(y0_l + 1000*(a_l)))
pt2_l = (int(x0_l - 1000*(-b_l)), int(y0_l - 1000*(a_l)))
cv.line(src_img, pt1_l, pt2_l, (0,0,255), 3, cv.LINE_AA)
cv.imshow("Image with lines", src_img)
cv.waitKey(0)
输出:
我们可以根据给定的图像更改 Canny()
和 HoughLines()
函数的参数以获得所需的结果。
可以通过更改 line()
函数的第四个和第五个参数来更改检测到的线条的颜色和线条粗细。
颜色应为 BGR 三元组值,线条粗细应为整数。
在 Python 中使用 OpenCV 的 HoughLinesP()
函数检测图像中的线条
HoughLinesP()
函数使用概率霍夫线变换来检测线。我们必须使用 imread()
函数读取给定图像,将其转换为灰度,然后使用 Canny()
找到它的边缘。
之后,我们可以通过 HoughLinesP()
函数内部的边缘来检测图像中存在的线条。HoughLinesP()
函数的前五个参数与上面讨论的 HoughLines()
函数相同。
第六个和第七个参数用于定义线间距的最小值和最大值。
例如,让我们检测数独图像中存在的线条。
请参阅下面的代码。
import cv2 as cv
import numpy as np
import math
src_img = cv.imread('test.png')
cv.imshow('Original Image',src_img)
dst_img = cv.Canny(src_img, 50, 200, None, 3)
linesP = cv.HoughLinesP(dst_img, 1, np.pi / 180, 50, None, 50, 10)
for i in range(0, len(linesP)):
lin = linesP[i][0]
cv.line(src_img, (lin[0], lin[1]), (lin[2], lin[3]), (0,0,255), 3, cv.LINE_AA)
cv.imshow("Image with lines", src_img)
cv.waitKey(0)
输出:
在这种情况下,两个函数的结果是相同的,但它可以根据给定的图像而变化。我们可以根据给定的图像更改 Canny()
和 HoughLinesP()
函数的参数以获得所需的结果。
可以通过更改 line()
函数的第四个和第五个参数来更改检测到的线条的颜色和线条粗细。颜色应为 BGR 三元组值,线条粗细应为整数。