2016-05-24 13 views
4

これは、OpenCVを直接使用するC++開発者にとっては単純でなければなりません。しかし私が使用しているのはEmgu(.NET用のOpenCVラッパー)で、最新のバージョンではCvInvoke.FindContoursのvoidメソッドが返され、出力結果はパラメータ参照で渡され、タイプはVectorOfVectorOfPointです。FindContoursメソッドで見つかった輪郭の階層をナビゲートしますか?

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

モードRetrType.Listのために、私たちは簡単にすべての輪郭を通じて配列とループの一部の配列に結果を変換することができます:ここでは

は、単純な呼び出しです。しかしここでは、ツリー内のすべての輪郭をナビゲートしたいと思います。私たちはポインタ(出力結果の Ptrプロパティを介してアクセス)を使ってここでネイティブ(安全でない)C++コードで何かをしなければならないと思います。しかし、これにはより.NET対応のソリューションがあるのだろうかと思います。ポインタを使用しても唯一の解決策であれば、輪郭ツリーをナビゲートするには、その Ptrをどのように掘り下げるのかまだ分かりません。

Emguインストールに伴うサンプルコードの代わりにCvInvoke.FindContourTreeを使用するスニペットがあります(int[,]を返します)。輪郭の階層を取得するには

+1

nullに設定した3番目のパラメータに階層が出力されていませんか? RetrType.ListまたはTreeを使用して階層情報を取得し、Matタイプの新しい変数を作成し、それを第3のパラメータ(現在はnullです)として渡すかどうかにかかわらず、まったく同じ方法でcountourを列挙できます。 – Evk

+0

@エヴァークはい、私は渡すべきものが第三のポジションにあることを理解していませんでした。そして、私がそれを知っていても、それがどんなタイプなのかわからないでしょう。今、あなたは私が「マット」を渡すべきであることを私に知らせる。しかし、私はちょうどそのタイプについてより多くのものを見つけようとしていますし、ツリーをナビゲートするのを助けるために簡単に認識できるメンバーはないようです。可能であれば、あなたの答えにいくつかのサンプルコードを与えてください。それは非常に高く評価されるだろう。ありがとうございました! – Hopeless

答えて

6

、あなたは最初の関数にMatオブジェクトを渡す必要があります。次のように

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

その後、hierarchyオブジェクトを使用することができます(PythonのOpenCVので詳細はhereを参照してください):

hierarchyインデックスiと輪郭用だからoutputResult X 4 のサイズ1×サイズのMat対象となります

  • hierachy[0,i,0]は、(同じ親を持つ)は、同じ階層レベルの次の輪郭のインデックス以上である - それは
  • hierachy[0,i,1]が存在しない場合は1と同じ階層レベルで前輪郭線のインデックスであるか、または - 1それは
  • hierachy[0,i,2]存在しない場合は、輪郭iかの子のインデックスである - そうでない場合は1 - それは
  • hierachy[0,i,3]存在しない場合は1輪郭iかの親の指標であります存在する

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

輪郭自体には、インデックスを使用してoutputResultオブジェクトを介してアクセスします。

+0

'Mat'は3つの引数を受け入れるインデクサーを持っていますか?私は 'Mat'の単純な変数を宣言しようとしましたが、' m [0,0,0] 'のようなものを書いてみると、何らかの設計時間エラーが発生し、もちろんコンパイルできません。あなたが提案したものは有効でPythonで動作するかもしれませんが、ここではC#で尋ねています。ありがとう! – Hopeless

+0

m.Data [0,0,0] 'を試しましたか?私はC#でそれをテストすることはできませんが、いくつかのオンラインでの答えは可能だと言うようです。 – Sunreef

+0

'm.Data'はさまざまな次元(ランク)を持つことができる' Array'ですので、ランクは '3'ですが、代わりに' GetValue'メソッドを使う必要があります( 'Array'には3人の議論を受け入れるインデクサー)。しかし、私は自分のコードを試してみたところ、 'm.Data'は実際には' 'ヌル' 'であり、ツリー構造が達成されなければならない場合、' m.Data'はツリーデータを引っ張る場所ではありません。この 'Map'自体は私にとってはかなり複雑ですが、それは何らかの汎用目的のクラスなので、この特定のシナリオでどのように使用するのかを知ることは難しいです。 – Hopeless

関連する問題