0

私の問題は、近くの輪郭を妥当な速度で結合することです。

大きな閉じた形状のイメージを含む 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
4

0 に答える 0