调试断言失败的 OpenCv is_block_type_valid(header->_block_use)

Debug Assertion Failed OpenCv is_block_type_valid(header->_block_use)

我是使用 Visual Studio 和 openCv 进行编程的新手。我写了一个简单的程序来显示图像的红色通道,但每次我 运行 代码都会抛出 "DEBUG ASSERTION FAILED" 错误。

#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>

#include <iostream>

using namespace std;
using namespace cv;

int main() {
    Mat image;
    image = imread("C:/Users/siddartha/Pictures/sample.jpg");
    if (!image.data) {
        cout << "Cannot load image";
        return -1;
    }
    else {
        if (image.channels() >= 3) {
            vector<Mat> rgb;
            split(image, rgb);
            namedWindow("r");
            imshow("r", rgb[0]);

        }
    }
    while (1);
    return 0;
}

错误:

Debug Assertion Failed!

Program: ...sual Studio 2015\Projects\sampleOpenCV\Debug\sampleOpenCV.exe
File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp
Line: 892

Expression: is_block_type_valid(header->_block_use)

它对我来说编译得很好。我在 visual-studio-2013 年。

这里有一个与你相似的案例,也许对你有帮助: debug-assertion-failed

您确定图像已正确加载吗?

我认为它没有被正确加载,因此向量 rgb 是空的,反过来,元素 rgb[0] 不存在会触发异常。 ..

我注意到的几件事:

  1. 对 include-statements 使用斜杠 (/) 而不是反斜杠 (\),即

    #include <opencv2\core.hpp> // Bad!
    #include <opencv2/core.hpp> // Good!
    
  2. 在您的支票中

    if (!image.data) { ... } 
    

    不要 假定 image.data 设置为 NULLnullptr 用于空图像。而是检查

    if (!image.empty()) { ... }
    
  3. 确保对 cv::imshow(...) 的调用之后是对 cv::waitKey( /* delay in ms or 0 to wait for user input */ ) 的调用,参见。 OpenCV reference.

  4. 中的注释
  5. while (1); -- 这是故意的吗?你想要的可能是cv::waitKey( 0 )(见3)。

更新:

  1. 确保矢量rgb已经初始化为通道数,即

    vector<Mat> rgb(image.channels());
    split(image, rgb);
    // ...
    

更新 2:

Can you tell me what exactly the error meant ?

三件事:

  1. std::vector<T> 的默认构造函数创建一个 向量。
  2. 显然,cv::split() 期望调用者,即 you,为输出分配数据。如果您不这样做,可能会引发 segmentation fault.
  3. 对于调试版本,一些编译器在内存中永远不会被触及的对象周围添加填充或安全内存。如果这个填充内存在运行时被改变,程序 "knows" 会发生一些不好的事情并抛出一个异常,就像你看到的那样。