2

私が取り組んでいるプログラムは、キャプチャされたフレーム内の最大の輪郭をフィルタリングし、それを赤く塗り、オブジェクトの中心座標を出力する輪郭検出プログラムですプログラムをデバッグすると、次のエラー メッセージが表示されることがあります。

OpenCV Error: Null pointer (NULL array pointer is passed) in unknown function, file ......../array.cpp line 2382

私はすでに問題の原因を検索し、最初の (および次の) キャプチャされたフレームに輪郭が検出されていない場合 (輪郭が NULL)、プログラムがクラッシュすることを発見しました。これまで、少なくとも輪郭が検出されるまで、このプログラムがエラーを無視するようにする解決策は見つかりませんでした。では、この問題の発生を防ぐ方法の手がかりはありますか?

前もって感謝します。乾杯

P/S: 輪郭が検出された後、プログラムは問題なく動作します。現在OpenCV 2.4.2を使用しています

4

2 に答える 2

1

輪郭が見つからない場合は、フレームの処理を忘れることをお勧めします。

cvFindContours( src_gray, storage, &contours, sizeof(CvContour), 
    CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cvPoint(0,0));
if(contours==NULL)
   continue;
于 2012-10-24T10:32:15.517 に答える
1

このコードでは:

CvSeq* largest_contour = NULL;
...
while (current_contour != NULL){
    double area = fabs(cvContourArea(current_contour,CV_WHOLE_SEQ, false));       
    if(area > largestArea){
        largestArea = area;
        largest_contour = current_contour;
    }
    current_contour = current_contour->h_next;
}

...あなたは、それ自体であり始め、 (それ自体も処理の開始時に)からの「猶予」がない場合、largest_contour等しいという結果になる可能性があります。NULLcurrent_contourNULLcontours2NULL

後で、気づいたように、によって「回復」されるので、存在は問題ではありませcontoursNULLcontours2

輪郭が検出された後、プログラムは問題なく動作します

しかし、最初のフレームでは、これは起こり得ません。

その後、largest_contour初期NULL値が変更されることはありません。

これは、次の行とうまく合わないと思われます。

cvMoments(largest_contour, &moments, 1);

次に、これを変更します

if (largest_contour)
    cvMoments(largest_contour, &moments, 1);
else
    continue; // loop to next frame
于 2012-10-24T10:39:30.140 に答える