Vb.net 如何合并点线算法

Vb.net 如何合并点线算法,vb.net,algorithm,merge,Vb.net,Algorithm,Merge,我正在写一个工具,我可以检测A4纸张。到目前为止,我所做的是模糊图像,然后得到图像的轮廓。然后我使用Hough线检测来获取图像中的所有线。下图中的线条是我检测出来的 下一步我要做的是合并所有线,它们彼此之间的角度几乎相同。但我不能让它工作。所以在下图中,你可以看到纸上有5行,我需要把它们合并成1行。所有其他线路的gos相同 当我得到我的线条并将它们延伸到图像边缘并添加交叉点检测(圆形红色图标)时,我会有点迷路。这就是为什么我需要合并这些线,以便能够检测出纸张角的位置 我现在要做的是,当一条直

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

下一步我要做的是合并所有线,它们彼此之间的角度几乎相同。但我不能让它工作。所以在下图中,你可以看到纸上有5行,我需要把它们合并成1行。所有其他线路的gos相同

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

我现在要做的是,当一条直线相交,角度差=0,并且点Y>=0时,去掉它 将角度1调整为整数=获取点之间的角度(线(i).P1,线(i).P2) 将角度2调整为整数=获取点之间的角度(线(j).P1,线(j).P2)
如果Math.Abs(angle1-angle2)适用于每条线段,则在线段中点处识别与该线段成直角的直线。那叫正常线路。要合并的候选线是在“足够近”距离内以“足够近”到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度之间,则应与第一条直线段合并为更长的直线段。

我真的不理解您的答案,你能举个例子吗?@Niels我修改过的解释有帮助吗?这是一张难以置信的随机照片。。。
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