1

ウェブカメラフィードを介してさまざまなフィルターを作成するプログラムを実行しようとしていますが、BLOB分析やその他の問題が発生しました。

グラスファイア機能をアクティブにするたびにsegFaultが発生します。これが私のgrassfire関数のコードです:

void testApp::grassFire(int mask_Y, int mask_X, unsigned char labelCnt)
{
    blobArray[mask_Y * camWidth + mask_X] = labelCnt;
    if (mask_X + 1 <= camWidth - 1 && blobArray[mask_Y * camWidth + mask_X + 1] == 0)
       grassFire(mask_Y, mask_X + 1, labelCnt);
    if (mask_Y + 1 <= camHeight - 1 && blobArray[(mask_Y + 1) * camWidth + mask_X] == 0)
       grassFire(mask_Y + 1, mask_X, labelCnt);
    if (mask_X - 1 >= 0 && blobArray[mask_Y * camWidth + mask_X - 1] == 0)
       grassFire(mask_Y, mask_X - 1, labelCnt);
    if (mask_Y - 1 >= 0 && blobArray[(mask_Y - 1) * camWidth + mask_X] == 0)
       grassFire(mask_Y - 1, mask_X, labelCnt);
}

そして、それがどのように呼ばれるかは、すべてのフレームを実行するスイッチケースによるものです。これは、すべてのフレーム更新が呼び出されることを意味します

関数自体は、他のスコープ外で宣言されています。

非常に重いフィルターであり、大量のメモリを使用している可能性があることはわかっていますが、他のいくつかのフィルターと比較すると、それほど悪くないため、segFaultが発生する理由がわかりません。

また、別のフィルターでsegFaultが発生しますが、これはメモリ使用量がそれほど要求されないはずです。私はwin7のコードブロックでopenframeworksを使用しています。

4

3 に答える 3

2

いくつかのチェックを行っているため、読み取り/書き込みで最後を貼り付けることができないようです。したがって、スタックオーバーフローblobArrayの犠牲になっていることを意味します。

デバッガーを使用してバックトレースを実行する必要があります。多くの呼び出しでは非表示にできません。

于 2013-01-05T21:43:06.400 に答える
0

0の配列値がたくさんある場合は、関数の再帰性が非常に高いため、スタックオーバーフローが発生している可能性があります。代わりに反復フラッドフィルアルゴリズムを試して、問題が解決するかどうかを確認することをお勧めします。

于 2013-01-05T21:39:49.587 に答える
0

アプリケーションにvalgrindをインストルメントします。Valgrindは、セグメンテーション違反が発生した場所のスタックトレースを表示します。

于 2013-01-14T19:52:46.137 に答える