0

cvFindContours を使用して、エッジ検出フレームの輪郭を見つけています。まず、cvCanny を使用して、実際のフレームからエッジ フレームを取得します。次に、輪郭を見つけようとしています。コード構造は次のとおりです

//cur と次のフレームを取得するために cvcanny を使用

CvMemStorage curstorage=CvMemStorage.create();
CvMemStorage nextstorage=CvMemStorage.create();

CvSeq cursquares = new CvContour();
CvSeq nextsquares = new CvContour();

cvFindContours(cur, curstorage, cursquares, Loader.sizeof(CvContour.class),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

cvFindContours(next, nextstorage, nextsquares, Loader.sizeof(CvContour.class),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

コードを実行すると、Access Violation Exception が発生します。例外の詳細は次のとおりです。

Java ランタイム環境によって致命的なエラーが検出されました:

PC=0x0000000062e3c320、pid=9184、tid=6236 での EXCEPTION_ACCESS_VIOLATION (0xc0000005)

JRE バージョン: 7.0_17-b02 Java VM: Java HotSpot(TM) 64 ビット サーバー VM (23.7-b01 混合モード windows-amd64 圧縮 oops) 問題のあるフレーム: C [msvcr100.dll+0x3c320] memset+0x80

コア ダンプの書き込みに失敗しました。ミニダンプは、クライアント バージョンの Windows では既定で有効になっていません。

javacv を使い始めたばかりなので、どこが間違っているのかわかりません。これに関する提案は役に立ちます。ありがとうございます。

4

1 に答える 1

0

おそらく、呼び出しのCvMemStorage後にインスタンスを参照せず、 のみを参照します。ストレージによっては CvSeq を使用する必要がありますが、ストレージは参照されていないと評価されて GC される可能性があります。これにより、GC が発生した後の最初の CvSeq の使用時に EXCEPTION_ACCESS_VIOLATION が発生します。cvFindContoursCvSeq

追加してみてください:

curstorage.release();
nextstorage.release();

CvSeqの使用をやめた後。これには 2 つの利点があります。GC を待たずにネイティブ メモリを積極的に解放し、GC がストレージを早期に解放するのを防ぎます。ここで私の質問を参照してください: JavaCV native object deallocation

于 2013-05-09T09:56:13.690 に答える