私の問題は、近くの輪郭を妥当な速度で結合することです。
大きな閉じた形状のイメージを含む CV8U シングルチャンネル グレースケール マットから始めます。この形の内側に生えているのは短い曲線です。私の使命は、曲線のみを点のベクトルにすることです。
そこで、マットのしきい値を設定し、FindContours を呼び出します。結果は、多くの等高線のベクトルです。一部はノイズで、マスクしきれなかった大きな形状のビットが含まれます。しかし、いくつかは私の曲線の一部です。問題は、生の画像で連続している曲線が、FindContours によって多くの輪郭に断片化されていることです。これを修正するために、常に曲線の一部である最大の輪郭を見つけ、近くにある他の輪郭を検索します。見つかったら、それらを結合して繰り返します。
最終的に、曲線を含む点のベクトルが 1 つできました。できます。しかし、すべてのループと反復により、愚かなほど遅くなります。
出力 (曲線を表す点のベクトル) を保持しながら高速に実行する別のアプローチは何ですか?
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