@H_403_1@
我正在写一个工具,我可以检测A4纸.到目前为止,我所做的是模糊图像然后获取图像的轮廓.然后我使用霍夫线检测来获得图像中的所有线条.下图中的线条出现在我的检测中.
我接下来要做的是将几乎相同角度的所有线合并在一起.但我不能让这个工作.因此,在下面的图像中,您可以看到纸张顶部有5行,我需要将它们合并为1.相同的gos用于所有其他行.
当我得到我的线条并将它们延伸到图像的边缘并添加交叉点检测(圆形红色图标)时,我有点迷失.这就是为什么我需要合并线条以便能够检测纸张角落的位置.
我现在所拥有的是当它相交并且角度差<= 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度之间的角度,应该与第一个线段合并为更长的线段.