我的问题是以合理的速度组合附近的轮廓。
我从一个CV8U单通道灰度垫开始,它包含一个大而闭合的形状的图像。这种形状内部的萌芽是一条短曲线。我的任务是将曲线仅变成点矢量。
所以我对垫子进行了限制并调用了FindContours。结果是许多轮廓的矢量。有些是噪音,包括我不太能掩盖的大块形状。但有些是我曲线的一部分。问题是,原始图像中的连续曲线被FindContours分割成许多轮廓。为了解决这个问题,我找到了最大的轮廓,它始终是我曲线的一部分,并搜索其他附近的轮廓。如果我找到了,我将他们加在一起,重复一遍。
最后,我有一个包含我的曲线的点矢量。有用。但是所有循环和迭代都使得它变得非常慢。
哪种替代方法会保留输出(表示我的曲线的点矢量)但运行速度快?
Private vpcurve As VectorOfPoint
...
GrowCurve(FindContoursOutput, inc, BiggestContourInFindContoursOutput)
...
Private Sub GrowCurve(ContoursToCheck As VectorOfVectorOfPoint, ContoursIncluded() As Boolean, StartContour As Integer)
vpcurve.Push(ContoursToCheck(StartContour).ToArray)
ContoursIncluded(StartContour) = True
For j = ContoursToCheck.Size - 1 To 0 Step -1
If Not ContoursIncluded(j) Then
If contoursClose(ContoursToCheck, j, StartContour) Then
GrowCurve(ContoursToCheck, ContoursIncluded, j)
End If
End If
Next
End Sub
Private Function contoursClose(cnt As VectorOfVectorOfPoint, index1 As Integer, index2 As Integer) As Boolean
For i As Integer = cnt(index1).Size - 1 To 0 Step -1
Dim p1 As Point = cnt(index1)(i)
For j As Integer = cnt(index2).Size - 1 To 0 Step -1
Dim p2 As Point = cnt(index2)(j)
If (Math.Pow(p1.X - p2.X, 2) + Math.Pow(p1.Y - p2.Y, 2)) < 30 Then 'arbitrary pixel distance
contoursClose = True
Exit Function
End If
Next
Next
contoursClose = False
End Function