vb.net – 如何合并点线算法

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

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

《vb.net – 如何合并点线算法》

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

《vb.net – 如何合并点线算法》

我现在所拥有的是当它相交并且角度差<= 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

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

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

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

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

点赞