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

vb.net – 如何合并点线算法,第1张

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

总结

以上是内存溢出为你收集整理的vb.net – 如何合并点线算法全部内容,希望文章能够帮你解决vb.net – 如何合并点线算法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1212917.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存