如何合并点线算法

时间:2015-12-04 22:55:25

标签: vb.net algorithm merge

我正在写一个可以检测A4纸的工具。到目前为止,我所做的是模糊图像然后获取图像的轮廓。然后我使用霍夫线检测来获得图像中的所有线条。下图中的线条出现在我的检测中。

接下来我要做的是将几乎相同角度的所有线合并在一起。但我不能让这个工作。因此,在下面的图像中,您可以看到纸张顶部有5行,我需要将它们合并为1.所有其他行的gos相同。

houghdetection

当我得到我的线条并将它们延伸到图像边缘并添加交叉点检测(圆形红色图标)时,我有点迷失。这就是为什么我需要合并线条以便能够检测纸张角落的位置。

enter image description here

我目前所拥有的是在相交时移除一条线并且角度差<= 2

Dim remove As New List(Of Integer)
    For i As Integer = 0 To lines.Length - 1
        For j As Integer = i + 1 To lines.Count - 1
            If Not remove.Contains(i) AndAlso Not remove.Contains(j) Then
                Dim pt As PointF = computeIntersect(lines(i).P1, lines(i).P2, lines(j).P1, lines(j).P2)
                If pt.X >= 0 AndAlso pt.Y >= 0 Then
                    Dim angle1 As Integer = GetAngleBetweenPoints(lines(i).P1, lines(i).P2)
                    Dim angle2 As Integer = GetAngleBetweenPoints(lines(j).P1, lines(j).P2)
                    If Math.Abs(angle1 - angle2) <= 2 Then
                        remove.Add(i)
                    End If
                End If
            End If
        Next
    Next
    Dim tmp As New List(Of LineSegment2D)
    For i As Integer = 0 To lines.Length - 1
        If Not remove.Contains(i) Then
            tmp.Add(lines(i))
        End If
    Next

所以我的问题是:如何合并第一个截图的线条,这些线条彼此接近并且几乎具有相同的角度或具有相同的角度?

1 个答案:

答案 0 :(得分:1)

对于每个线段,在线段的中点处标识与该线段成直角的线。称之为正常线。你的合并候选者是任何两条线,它们在“足够接近”的距离内以足够接近90度的角度与该法线相交。

因此,例如,假设线段从(x1, y1)变为(x2, y2)。中点是((x1 + x2)/2, (y1 + y2)/2)。法线将通过该中点和((x1 + x2)/2 + y2 - y1, (y1 + y2)/2 + x1 - x2)。 (注意y2-y1x1-x2的反转索引。这使得它成直角。)

然后,您可以设置一个规则,即任何其他线段的延伸线与中点的10个像素内的法线相交,在88到92度之间的角度,应该与第一个线段合并为更长的线段。