Python 如何使用 OpenCV 使用 HoughLines 检测图像中的垂直线和水平线?

Python How to detect vertical and horizontal lines in an image with HoughLines with OpenCV?

我正在尝试获取校准棋盘的阈值。我无法直接检测到棋盘角,因为我观察微型棋盘时有一些灰尘。 我尝试了几种方法,HoughLinesP 似乎是最简单的方法。但是成绩不好,如何提高成绩?

import numpy as np
import cv2

img = cv2.imread('lines.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
print img.shape[1]
print img.shape
minLineLength=100
lines = cv2.HoughLinesP(image=edges,rho=0.02,theta=np.pi/500, threshold=10,lines=np.array([]), minLineLength=minLineLength,maxLineGap=100)

a,b,c = lines.shape
for i in range(a):
    cv2.line(img, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3, cv2.LINE_AA)
    cv2.imwrite('houghlines5.jpg',img)

如下图所示,我无法获取我的棋盘,线条绘制在很多方向...(原图:https://s22.postimg.org/iq2b91xq9/droite_Image_00000.jpg

我宁愿把它写成评论,但不幸的是我不能。您应该更改 minLineLength 和 minLineGap。或者如果它只是你必须找到的正方形怎么办,我会得到所有的线并检查它们之间的角度以仅沿着正方形获得线。我之前使用过 HoughLineP,它几乎基于上述两个论点。此外,尝试使用双边过滤。当使用中值滤波器的锐化没有帮助时,我真的很有帮助。

Bilateral Filter

在图像处理中,它们是您在进行边缘检测之前必须经历的一些角色,例如过滤器,在您的情况下,灰尘只是您必须通过过滤器去除的噪音,之后使用高斯或模糊使用阈值处理,然后对边缘使用 canny,在 opencv 中,它们是您可以使用的角点检测,或者如果我没记错的话,您可以在阈值处理后寻找关键点。尝试执行这些步骤并查看结果

您使用的 rho 值太小。

试试下面的代码:-

import numpy as np
import cv2

gray = cv2.imread('lines.jpg')
edges = cv2.Canny(gray,50,150,apertureSize = 3)
cv2.imwrite('edges-50-150.jpg',edges)
minLineLength=100
lines = cv2.HoughLinesP(image=edges,rho=1,theta=np.pi/180, threshold=100,lines=np.array([]), minLineLength=minLineLength,maxLineGap=80)

a,b,c = lines.shape
for i in range(a):
    cv2.line(gray, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3, cv2.LINE_AA)
    cv2.imwrite('houghlines5.jpg',gray)

注意,改变 rho 值、pi 值和 maxLineGap 以减少离群值。

输入图像

边缘图像

输出图像

杂项 - 初学者提示

  1. 很多计算机视觉算法都假设了某些假设,好吧,输入应该是怎样的。在构建概念验证时,请始终在应用此类算法之前尝试查看您生成的中间输入。

  2. 为了快速破解,如果算法接受某些参数,请对这些参数的可能值使用 for 循环并查看结果如何变化。 获取有关如何快速生成这些可能值的答案。

  3. 要真正理解该算法,请在必要时阅读 wiki 或更好的资源。然后 again/still 执行上述 hack(第 2 点)。它将进一步澄清您的理解。