python - 使用 Hough 变换、OpenCV 和 python 进行平行线检测

标签 python algorithm opencv image-processing hough-transform

我需要有关我一直在研究的算法的帮助。我正在尝试检测阈值图像中的所有线条,检测所有线条,然后仅输出平行的线条。阈值图像输出我感兴趣的对象,然后我通过精明的边缘检测器过滤该图像。然后将该边缘图像通过概率霍夫变换。现在,我希望该算法能够检测任何图像中的平行线。我想通过尝试检测所有线的坐标并计算它们的斜率(然后用这个角度)来做到这一点。平行线必须具有相同或几乎相同的角度,这样我只能输出具有相同角度的线。我也许可以在图像中画一条假想线,然后将其用作图像中所有检测到的线的引用?我只是不明白如何使用通过函数 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() 的输出变量。我还找到了一个应该计算斜率的代码。我试过了,但只是给了我一个值(一个斜率)。我想要图像中所有线条的斜率。

最佳答案

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

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

对不起,我不能给你使用cv2.HoughLinesP的代码,我不知道这个函数。我希望这个描述能给你一个起点。

关于python - 使用 Hough 变换、OpenCV 和 python 进行平行线检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48677185/

相关文章:

python - 尝试使用distutils交叉编译mingw32的SWIG Python扩展时出错

c# - 在循环中迭代项目

python - 尝试编写 C++ 包装函数时无法在 Cython 中将 Numpy 数组转换为 OpenCV Mat

python - 如何创建一个空的蓝色图像?

java - 使用 OpenCV 查找图像上数字的边界框

python - 如何合并两个视频?

python - 从父函数获取变量

python - 在多个大文件中查找顶部二元组

javascript - 如何相交两个范围数组?

algorithm - 编写加权负载均衡算法