[英]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
代码,我不知道此功能。 我希望这个描述能给你一个起点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.