【问题标题】:Python OpenCV HoughLinesP Inaccurate Line DetectionPython OpenCV HoughLinesP 不准确的线检测
【发布时间】:2020-01-17 08:31:42
【问题描述】:

考虑图像中的三个点 A、B、C。

下面是它们在 300x300 尺寸图像中的坐标。

我正在尝试使用下面的 HoughLinesP 代码检测并绘制一条连接这三个点的线。

import cv2
import numpy as np

img = cv2.imread('test.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #Convert img to grayscale 
lines = cv2.HoughLinesP(img, rho=1, theta=np.pi/180, threshold=1, minLineLength=5, maxLineGap=10)
print(lines)

for line in lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(img, (x1, y1), (x2, y2), 255, 1)
cv2.imshow("result", img)

但它检测到一条只通过B和C的线。为什么会这样?

Output:
[[[110 100 120 100]]]

【问题讨论】:

    标签: python opencv computer-vision houghlinesp


    【解决方案1】:

    cv2.HoughLinesP()主要用于检测线,并不是真正用于绘图。要根据您的三个点画一条线,您可以尝试其他一些选项。第一种方法是通过找到最左边和最右边的点然后用cv2.line() 绘制线来过滤点。另一种方法是找到所有点然后使用cv2.fillPoly()。第三种方法是使用cv2.polylines()

    import cv2
    import numpy as np
    
    image = cv2.imread('1.png')
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    coords = np.column_stack(np.where(gray > 0))
    coords = np.rot90(coords, 2)
    cv2.fillPoly(image, [coords], (36,255,12)) # or
    # cv2.polylines(image, [coords], 1, (36,255,12))
    
    cv2.imshow('image', image)
    cv2.imwrite('image.png', image)
    cv2.waitKey()
    

    【讨论】:

    • HoughLinesP 主要用于检测线,在你的图像中你有三个点而不是一条线。也许在填充点以创建一条线之后,您可以使用 HoughLinesP
    • 谢谢。这个点和图像只是为了理解 HoughLinesP 与阈值参数的工作。而且我相信它可以通过连接出现在直线上的点(不仅仅是线)来工作。
    • HoughLinesP 在增加累加器的分辨率和阈值后工作。
    【解决方案2】:
    • 通过提供更小的值来提高累加器的分辨率 对于 rho 和 theta。
    • 将累加器的阈值设置为最小值 2。
    lines = cv2.HoughLinesP(img, rho=0.1, theta=np.pi/180 * 0.1, threshold=2, minLineLength=5, maxLineGap=10)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多