简体   繁体   中英

Debug Assertion Failed OpenCv is_block_type_valid(header->_block_use)

I am new to Programming using Visual Studio and openCv. I wrote a simple program to display the red channel of an image, but every time i run the code it throws "DEBUG ASSERTION FAILED" error.

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

Error:

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)

错误窗口

Are you absolutely sure that the image has been loaded correctly?

I would think that it hasn't been loaded correctly and because of that the vector rgb is empty and, in turn, the element rgb[0] doesn't exist which triggers the exception ...

A couple of things I noted:

  1. Use slashes ( / ) for include-statements not backslashes ( \\ ), ie

     #include <opencv2\\core.hpp> // Bad! #include <opencv2/core.hpp> // Good! 
  2. In your check

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

    do not assume that image.data is set to NULL or nullptr for empty images. Instead check

     if (!image.empty()) { ... } 
  3. Make sure that calls to cv::imshow(...) are followed by a call to cv::waitKey( /* delay in ms or 0 to wait for user input */ ) , cf. the note in the OpenCV reference .

  4. while (1); -- is that intentional? What you want is probably cv::waitKey( 0 ) (see 3.).

UPDATE:

  1. Make sure the vector rgb has been initialized to the number of channels, ie

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

UPDATE 2:

Can you tell me what exactly the error meant ?

Three things:

  1. The default constructor of std::vector<T> creates an empty vector.
  2. Apparently, cv::split() expects the caller, ie you , to allocate data for the output. If you fail to do so, it's likely provoke a segmentation fault .
  3. For debug builds some compilers add padding or safety memory around objects in memory which is never to be touched. If this padding memory is altered at runtime, the program "knows" that something bad happened and throws an exception like the one you saw.

it is compiling just fine for me. I am on visual-studio-2013.

here you have a case similar to yours, maybe it will help: debug-assertion-failed

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM