为什么我解决了“Debug Assertion Failed OpenCv is_block_type_valid(header-> _block_use)”

时间:2016-07-19 14:37:18

标签: c++ opencv vector point opencv-contour

我在OpenCV中使用findCountours()时遇到过这种情况, Debug Assertion Failed 我有很多谷歌,但没有任何帮助我,以下是我的代码的一部分。

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);
}

Belows就是我的尝试:

  1. 最后添加imshow("img",BinaryImage);,没有任何变化;

  2. 评论这一行↓,一切顺利

    findContours(BinaryImage, hand_contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);

  3. 逐步执行代码,一切顺利,直到

    下方的'}'

    waitkey(1); }

  4. 在waitkey(1)之前添加hand_contours.~vector();(破坏功能); Debug Assertion Failed显示在何处;

  5. 最后,我通过将局部变量'hand_contours'更改为全局变量来解决它。 但我仍然想知道它为什么会解决。感谢您阅读:)

    ignore it,images in debuging

1 个答案:

答案 0 :(得分: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位的单通道图像。”正如documentation.所要求的那样,它可能不会被正确截断。

您的GrayImage源自彩色图像,可能偶尔会有一些空白通道。 Check确保你的dst和src Mat都是正确的格式(断言失败的时间是99.9%)。

关于如何通过改变全球来解决这个问题?没有看到剩下的代码就没有办法告诉你。 我最好的猜测是,它不知何故导致你的一些函数在你到达上面展示的函数之前将你的MAT的内容改为你想要的格式。但是没有看到它就没有办法告诉你。

但是,故事的道德是只要你可以检查你的src和dst格式正确你将避免大多数断言失败。