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

时间:2016-01-13 06:59:31

标签: c++ opencv visual-studio-2015 visual-studio-debugging

我是使用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)

Error Window

2 个答案:

答案 0 :(得分:5)

您是否完全确定图像已正确加载?

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

我注意到的一些事情:

  1. 对包含语句使用斜杠(/)而不是反斜杠(\),即

    #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 */ ),cf。 OpenCV reference

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

  6. <强>更新

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

      vector<Mat> rgb(image.channels());
      split(image, rgb);
      // ...
      
    2. 更新2:

        

      你能告诉我这个错误究竟是什么意思吗?

      三件事:

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

答案 1 :(得分:0)

它正在编译对我来说很好。我在视觉工作室 - 2013年。

这里你有一个类似于你的案例,也许它会有所帮助: debug-assertion-failed