OpenCV 线检测

Ammar Ali 2023年1月30日 2022年5月17日
  1. 在 Python 中使用 OpenCV 的 HoughLines() 函数检测图像中的线条
  2. 在 Python 中使用 OpenCV 的 HoughLinesP() 函数检测图像中的线条
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)

输出:

检测线第 1 部分

我们可以根据给定的图像更改 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)

输出:

检测线第 1 部分

在这种情况下,两个函数的结果是相同的,但它可以根据给定的图像而变化。我们可以根据给定的图像更改 Canny()HoughLinesP() 函数的参数以获得所需的结果。

可以通过更改 line() 函数的第四个和第五个参数来更改检测到的线条的颜色和线条粗细。颜色应为 BGR 三元组值,线条粗细应为整数。

Author: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相关文章 - OpenCV Image