2016-12-23 16 views
0

私の背景はC++で、OpenCVを使用するアプリケーションのうちEmguCVを使用するC#アプリケーションに翻訳しようとしています。私はEmguCVのドキュメントとWikiとStackOverflow Q/Asを基本的な問題のいくつかを解決するのに運がない人間的に可能な限り深く読んだ。この時点で、私はEmguCVについての考え方に根本的に欠陥があるのだろうかと思います。Emgu CV 3.1を使用した正しいメモリ管理方法

それは Mat私の場合には( IInputOutputArray秒を返すことをポイントに、独自のメモリ管理の面倒を見るの下に、私は、EmguCVはのは CvInvoke.FloodFill(IInputOutputArray, IInputOutputArray, ...)を使用して FloodFillを言わせためのC++ライブラリへのインターフェースを提供してきたという印象の下にあった

)はすべて世話をしています。しかし実際には、CvInvoke.FloodFillへの呼び出しは、dll内からの例外を伴い失敗します。

int i = ... 
int j = ... 
int intensity = ... 
int height = img.Rows; 
int width = img.Cols; 
Mat outputMask = new Mat(height + 2, width + 2, DepthType.Cv8U, 1); 
Rectangle dummy = new Rectangle(); 
CvInvoke.FloodFill(img, outputMask, new Point(i, j), new MCvScalar(255), out dummy, new MCvScalar(intensity), new MCvScalar(intensity), Connectivity.EightConnected, FloodFillType.MaskOnly); 

しかし、コールは役に立たない例外の説明で失敗します。

これは私が持っているものです。私はGCHandle割り振りと他の方法の下に生データにアクセスできるようにピン配置を使用しましたが、私はCvInvoke.FloodFillはローカルMatで呼び出されたときに安全であると信じています。

私の質問は、EmguCVがC++とOpenCVで自分のバックグラウンドで使用されることになっていることを完全に忘れているかどうかです。もしそうなら、そのような関数を呼び出す正しい方法は何ですか?

答えて

0

これは、EmguCV 3.1 FloodFillで同じ問題を抱えている可能性のある人を対象としています。かなり長い間私のコードをデバッグした後、私は確信していますCvInvoke.FloodFillのEmguCV 3.1実装はバグです。 FloodFillType.MaskOnlyフラグを使ってその方法からマスクを得る方法はありませんでした。

代わりに、私はその後、0254間の値を持つように私のオリジナル画像を編集し終わった通常のFLOODFILLが255の値を埋める使用していました。次にImage.InRange()メソッドを使用して、すべてのピクセルを元の画像から分離しました。バグをEmguCVチームに報告し、何が起こるかを見ていきます。

関連する問題