5

これは、OpenCV を直接使用する C++ 開発者にとって単純でなければなりません。ただし、私が使用しているのは Emgu (.NET の OpenCV ラッパー) であり、最新バージョンではCvInvoke.FindContoursvoid を返すメソッドがあり、出力結果はパラメーター参照によって渡され、タイプはVectorOfVectorOfPointです。

簡単な呼び出しは次のとおりです。

//outputResult is a VectorOfVectorOfPoint
CvInvoke.FindContours(inputImage, outputResult, null, RetrType.Tree, 
                      ChainApproxMethod.ChainApproxSimple);

モードの場合RetrType.List、結果を配列の配列に変換し、すべての輪郭を簡単にループできます。ただし、ここでは、ツリー内のすべての輪郭をナビゲートしたいと思います。Ptrここでは、ポインター (出力結果のプロパティを介してアクセス) を使用して、ネイティブ (安全でない) C++ コードで何かを行う必要があると思います。しかし、これにはもっと .NET に適したソリューションがあるのではないかと思います。Ptrそして、ポインターを使用することが唯一の解決策である場合でも、輪郭ツリーをナビゲートするためにそれを掘り下げる方法はまだわかりません。

Emgu のインストールに付随するサンプル コードには、CvInvoke.FindContourTree代わりに を使用するスニペットがあります (これは を返しますint[,])。

4

1 に答える 1

7

等高線の階層を取得するには、最初にMatオブジェクトを関数に渡す必要があります。

Mat hierarchy = new Mat() ;
CvInvoke.FindContours(inputImage, outputResult, hierarchy, RetrType.Tree, 
                  ChainApproxMethod.ChainApproxSimple);

hierarchy次に、オブジェクトを次のように使用できます ( Python OpenCV の詳細については、こちらを参照してください)。

hierarchyMatサイズ 1 x サイズoutputResultx 4のオブジェクトになりiます。

  • hierachy[0,i,0]同じ階層レベル (同じ親を持つ) の次の等高線のインデックス、または存在しない場合は - 1
  • hierachy[0,i,1]同じ階層レベルの前の等​​高線のインデックス、または存在しない場合は - 1
  • hierachy[0,i,2]輪郭の子のインデックス、iまたは存在しない場合は - 1
  • hierachy[0,i,3]輪郭の親のインデックス、iまたは存在しない場合は - 1

これが階層オブジェクトの使用方法です。

輪郭自体はoutputResult、そのインデックスを使用してオブジェクトからアクセスされます。

于 2016-05-26T21:03:20.617 に答える