0

OpenCV で findCountours() を使用しているときにこれに遭遇しました。 デバッグ アサーションに失敗し ました

void HandTrack::ProcessFrame(...){
    ...
    //Convert the colorImage into grayImage
    Mat GrayImage;
    cvtColor(ColorImages, GrayImage, CV_BGR2GRAY);

    //Convert grayImage into binaryImage
    Mat BinaryImage(GrayImage.rows, GrayImage.cols, CV_8UC1);
    threshold(GrayImage, BinaryImage, 254, 255, CV_THRESH_BINARY);
    bitwise_not(BinaryImage, BinaryImage);

    //Get the contours from binaryImage
    vector<vector<Point>> hand_contours;
    findContours(BinaryImage, hand_contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
    BinaryImage.release();

    //Draw the contours
    Mat OutlineImage(GrayImage.rows, GrayImage.cols, CV_8UC1);
    rectangle(OutlineImage, Point(0, 0), Point(BinaryImage.cols, BinaryImage.rows), Scalar(255, 255, 255),-1,8);
    if (hand_contours.size() > 0) {
        drawContours(OutlineImage, hand_contours, -1, (0, 0, 0), 1);
    }

    waitkey(1);
}

以下は私が試したことです:

  1. imshow("img",BinaryImage);最後に追加して、何も変わらない;

  2. この行にコメントしてください↓、すべてうまくいきます

    findContours(BinaryImage, hand_contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);

  3. コードをステップ実行します。

    waitkey(1); }

  4. hand_contours.~vector();waitkey(1) の前に追加(関数の破壊); Debug Assertion Failed はどこにいても表示されます。

最後に、ローカル変数「hand_contours」をグローバル変数に変更して解決しました。 しかし、なぜそれが解決したのか、私はまだ疑問に思っています。読んでくれてありがとう:)

無視する,デバッグ中の画像

4

1 に答える 1

0

あなたの問題はここのどこかにあります:

//Convert the colorImage into grayImage
Mat GrayImage;
cvtColor(ColorImages, GrayImage, CV_BGR2GRAY);

//Convert grayImage into binaryImage
Mat BinaryImage(GrayImage.rows, GrayImage.cols, CV_8UC1);
threshold(GrayImage, BinaryImage, 254, 255, CV_THRESH_BINARY);
bitwise_not(BinaryImage, BinaryImage);

//Get the contours from binaryImage
vector<vector<Point>> hand_contours;

BinaryImage を CV_8UC1 として作成したのは良いことですが、GrayImage が常に「...8 ビットのシングル チャネル イメージ」になるとは限らないと感じています。ドキュメントで要求されている とおり。途中のどこかで、おそらく正しく切り捨てられません。

あなたの GrayImage はカラー画像から派生したもので、おそらくいくつかの空のチャンネルがあります。dst と src の両方の Mat が正しい形式であることを確認してください (99.9% の確率でアサーションの失敗が発生します)

グローバルを変更することでこの問題がどのように解決されたのですか? コードの残りの部分を見ずに判断する方法はありません。私の推測では、上記の関数に到達する前に、関数の一部が MAT の内容を意図した形式に変更した可能性があります。でも実際に見ないとなんとも言えません。

しかし、この話の教訓は、src と dst が正しくフォーマットされていることを確認できる限り、ほとんどのアサーションの失敗を回避できるということです。

于 2016-07-19T15:52:00.937 に答える