繁体   English   中英

使用 Hough Transform、OpenCV 和 python 进行平行线检测

[英]Parallel Line detection using Hough Transform, OpenCV and python

我需要有关我一直在工作的算法的帮助。 我试图检测阈值图像中的所有线条,检测所有线条,然后仅输出那些平行的线条。 阈值图像输出我感兴趣的对象,然后我通过一个精明的边缘检测器过滤这个图像。 然后将此边缘图像通过概率霍夫变换。 现在,我希望该算法能够检测任何图像中的平行线。 我想通过尝试检测所有线的坐标并计算它们的斜率(然后是角度)来做到这一点。 平行线必须具有相同或几乎相同的角度,这样我只能输出具有相同角度的线。 我可以在图像中绘制一条假想线,然后将其用作图像中所有检测到的线的参考? 我只是不明白如何使用通过函数 cv2.HoughLinesP() 检测到的所有线的坐标。 这个函数的文档说输出是一个 4D 数组,这让我很困惑。 这是我的代码的一部分:

通过概率霍夫变换进行线检测

rho_res = .1 # [pixels]

theta_res = np.pi / 180. # [radians]

threshold = 50 # [# votes]

min_line_length = 100 # [pixels]

max_line_gap = 40 # [pixels]

lines = cv2.HoughLinesP(edge_image, rho_res, theta_res, threshold, np.array([]),

                        minLineLength=min_line_length, maxLineGap=max_line_gap)

画线

    if lines is not None:
                for i in range(0, len(linesP)):
                    coords = lines[i][0]
                    slope = (float(coords[3]) - coords[1]) / (float(coords[2]) - coords[0])
                    cv2.line(img, (coords[0], coords[1]), (coords[2], coords[3]), (0,0,255), 2, cv2.LINE_AA)

关于如何推断所有检测到的线然后只输出平行线的任何想法? 我在网上尝试了一些算法,但似乎都不起作用。 同样,我的问题是理解和使用函数 cv2.HoughLinesP() 的输出变量。 我还找到了一个应该计算斜率的代码。 我试过了,但只是给了我一个值(一个斜率)。 我想要图像中所有线条的斜率。

使用atan2函数计算0..Pi范围内所有线的斜率(角度)。 要通过正角度限制范围,请将Pi添加到负结果。

按斜率对结果进行排序。 遍历排序列表,为接近的值建立联合——这些线几乎平行。 请注意,对于略有不同的邻居值,您可能有很长的系列,但系列的开始和结束可能会有很大不同。 所以使用一些(角度)阈值来中断系列运行。

将霍夫变换投影到角度轴上。 这为您提供了作为 theta 函数的一维信号,该信号与该方向的“线量”成正比。 此信号中的峰值表示具有许多平行线的方向。 找到最大的峰值,它会给你一个 theta。

现在回到霍夫变换图像,并用这个 theta 值检测峰值(也许允许一点点摆动)。 现在您将在此方向上拥有所有平行线。

抱歉,我无法为您提供适用于cv2.HoughLinesP代码,我不知道此功能。 我希望这个描述能给你一个起点。

我只是不明白如何使用通过函数 cv2.HoughLinesP() 检测到的所有线的坐标。 这个函数的文档说输出是一个 4D 数组,这让我很困惑。

4D 数组只是检测到的线的输出向量。 每条线由一个 4 元素向量 (x1, y1, x2, y2) 表示,其中 (x1,y1) 和 (x2, y2) 是每个检测到的线段的终点。

请参阅所附图片以了解这些含义。 请记住,那些协调的人在图像空间中。

检测线

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM