4

opencv 2.4.0で問題が発生すると、findContours関数が常にクラッシュします。残念ながら、問題を特定することは非常に困難でした。誰かが同様の問題に遭遇したことを願っています。

Microsoft K4W SDK 1.5を使用してKinectセンサーから深度ストリームをキャプチャし、それをOpenCV Matにコピーしてから、cvtColorとthresholdを介して8UC1画像に変換しています。findNonZeroを実行して、画像が空白でないことを確認してから、findContoursに渡します。しかし、最も単純なfindcountours実装でさえクラッシュします。

これが私の基本的なコードです:

rawdepth = Mat(Size(640,480),CV_8UC4);
thresh = Mat::zeros(640,480,CV_8UC1);

// storage for contours 
vector<vector<Point>> contours;

cvtColor(rawdepth,thresh,CV_RGB2GRAY);
threshold(thresh,thresh,0,255,THRESH_BINARY);

if(countNonZero(thresh) > 100 ) {
    // This crashes
    findContours(thresh,contours,RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);           
} 

findcontoursに渡される実際のマットがシングルチャンネル画像であり、空白ではないことを確認しました(つまり、500以上のポイントがあります)。しかし、findcontoursが実際に入力マットを変更できると聞いたので、これがヒープまたはスレッドに関連する問題であるかどうか疑問に思っていますか?

この時点で、リリースされたばかりのOpenCV 2.4.1を試して使用しますが、この問題の修正を示す修正済みのバグはありません。

どんなアイデアでも大歓迎です...

4

3 に答える 3

2

問題は、プログラムのスタック使用量を10MB(10,000,000バイト)に制限していたコンパイラフラグであることが判明しました。残念ながら、これは私がキャプチャしていたKinectビデオには十分ではありませんでした。コンパイラフラグを削除すると、findContoursがコンパイルされて正しく動作するようになります。

私はVC++2010を使用しており、コンパイラフラグは[プロジェクトのプロパティ]->[リンカー]->[システム]の下にありました。2つのフィールドは、「スタック予約サイズ」「スタックコミットサイズ」でした。

それらをクリアして再コンパイルした後、プロジェクトは美しく機能します!

于 2012-07-05T01:02:40.417 に答える
1

ここには2つの問題が考えられます。

まず、Kinectからの生の深度ストリームは16ビット(3 LSBはプレーヤーインデックス、残りの13ビットはmm単位の深度)であるため、そのデータを8ビット画像にコピーすると、半分しか取得できず、gobbledegookになります。

次に、OpenCVは、デバッグ構成とリリース構成で異なる方法でコンパイルされます。デバッグプロファイルを使用してコンパイルする場合は、デバッグライブラリ(バージョン#d)を使用する必要があります。したがって、cv :: findContoursを使用するには、opencv_imgproc240。[lib/dll]とopencv_core240。[lib/dll]が必要です。間違った構成を使用している場合、cv :: namedWindow / cv :: imshow(デバッグに非常に便利です)もcv::findContoursも正しく機能しません。

お役に立てば幸いです。

于 2012-06-22T10:22:33.423 に答える
1

2番目の回答で述べたように、findContours()メソッドのクラッシュに関して同じ問題があったことを指摘したいと思います。問題は、デバッグモードでopencv_imgproc240.dllとopencv_core240.dllの非デバッグバージョンを使用していたことでした。 、XXd.dllに変更すると、問題が解決しました。

于 2012-09-12T02:50:47.590 に答える