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

Posted

技术标签:

【中文标题】调试断言失败 OpenCv is_block_type_valid(header->_block_use)【英文标题】:Debug Assertion Failed OpenCv is_block_type_valid(header->_block_use) 【发布时间】:2016-01-13 06:59:30 【问题描述】:

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

【问题讨论】:

这能回答你的问题吗? Why do I get _CrtIsValidHeapPointer(block) and/or is_block_type_valid(header->_block_use) assertions? 【参考方案1】:

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

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

我注意到了几点:

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

    #include <opencv2\core.hpp> // Bad!
    #include <opencv2/core.hpp> // Good!
    

    在您的支票中

    if (!image.data)  ...  
    

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

    if (!image.empty())  ... 
    

    确保在调用cv::imshow(...) 之后再调用cv::waitKey( /* delay in ms or 0 to wait for user input */ ),参见。 OpenCV reference 中的注释。

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

更新:

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

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

更新 2:

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

三件事:

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

【讨论】:

我做了你所说的所有更正。但是现在当我最后按下一个键退出时它显示DEBUG Assertion Failure。 更新 rgb 对我有用。你能告诉我这个错误到底是什么意思吗? 再次更新了我的答案。【参考方案2】:

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

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

【讨论】:

以上是关于调试断言失败 OpenCv is_block_type_valid(header->_block_use)的主要内容,如果未能解决你的问题,请参考以下文章

调试断言失败表达式:_pFirstBlock == pHead 使用 OpenCV 和 C++ 尝试调用 SurfFeatureDetector

调试断言失败

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

调试断言失败(无符号)(c+1)<= 256(在 VideoCapture::open [Qt Creator] 中)

调试断言错误 - OpenCV

OpenCV 错误:互相关中的断言失败