当前位置: 首页 > 知识库问答 >
问题:

基于Hough变换、OpenCV和python的平行线检测

左丘涵畅
2023-03-14

我需要一个我一直在工作的算法的帮助。我试图检测阈值图像中的所有线条,检测所有线条,然后只输出那些平行的线条。阈值图像输出我感兴趣的对象,然后我通过canny边缘检测器过滤该图像。然后,该边缘图像通过概率Hough变换。现在,我希望该算法能够检测任何图像中的平行线。我想通过检测所有直线的坐标并计算它们的斜率(然后是角度)来实现这一点。平行线必须具有相同或几乎相同的角度,这样我只能输出具有相同角度的线。我可以在图像中画一条假想的线,然后用它作为图像中所有检测到的线的参考?我只是不知道如何使用通过函数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()。我还找到了一个应该计算斜率的代码。我尝试了这个,但只是给我一个值(一个斜率)。我想要图像中所有线条的斜率。

共有3个答案

甄煜
2023-03-14

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

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

请参考所附图片了解这些内容的含义。请记住,那些协调的是在图像空间中。

高和通
2023-03-14

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

现在回到Hough变换图像,用这个θ值检测峰值(可能允许一点晃动)。现在,在这个方向上有所有平行线。

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

景书
2023-03-14

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

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

 类似资料:
  • 我正在尝试使用Python OpenCV和Hough变换算法检测表线并从图像中提取完整的表。我需要有每条线的所有坐标,目的是绘制相同比例的相同表格。我了解Hough变换的工作原理,并尝试在没有OpenCV的情况下实现它,但在大图像上速度非常慢。 这是来自示例OpenCV Hough Transfrom的代码 Canny边缘检测返回图像Canny边缘检测结果 但是检测的结果是豪斯变换的结果 我不知道

  • 我正在尝试使用opencv 4 android sdk检测矩形文档。首先,我试图通过查找轮廓来检测它,但它不适用于多色文档。您可以查看此链接以获得更好的想法:使用OpenCV4Android检测多色文档 我做了很多研究,发现可以用houghline变换来完成。所以我按照以下方法检测文档: 原始图像- 我对hough线变换所做的是: 从上面的水平线和垂直线列表中,我找到了以下交叉点: 从这四个交点我

  • 我尝试过各种演示代码,如“opencv查找:轮廓”,模板匹配(效果不好,因为它无法检测到顶盖的旋转) 我发现最好的方法是将Canny边缘检测和Hough变换圆相结合,这样Canny边缘检测的输出结果可以是Hough变换圆的输入图像,结果如下。 不幸的是,并非所有圆圈都被检测到,如果我更改

  • 可以通过使用类的方法应用霍夫变换技术来检测给定图像的形状。以下是此方法的语法。 该方法接受以下参数 - image - 表示此操作的源(输入图像)的对象。 lines - 类的一个对象,用于存储存储线的参数的向量。 rho - 类型为的变量,以像素为单位表示参数的分辨率。 theta - 类型为的变量,表示以弧度表示的参数的分辨率。 threshold - 一个整数类型的变量,表示“检测”一条直线

  • 我在网上阅读,发现可以根据使用边缘检测器检测到的线数,然后应用Hough变换来判断图像是否像素化<我试过那种方法,但霍夫变换似乎无法正确检测线条,我不明白为什么它不能正常工作 以下是一些可供参考的结果图像:canny边缘检测结果 以及霍夫变换的结果 如何改进测线检测 我使用的代码基于一些在线教程:

  • 我想用OpenCV fullbody Haar Cascades检测图像中的人体。这是我的代码: 结果如下: 后果 如您所见,我的代码没有检测到图像中的整个人体。 顺便说一句,我是OpenCv的新手,这是我在这里的第一个问题,所以如果我做错了什么,请纠正我,我希望有人能帮助我纠正我的代码。 抱歉英语不好;)。