C++ 调试断言失败OpenCv是\u块\u类型\u有效(标头->;\u块\u使用)

C++ 调试断言失败OpenCv是\u块\u类型\u有效(标头->;\u块\u使用),c++,opencv,visual-studio-2015,visual-studio-debugging,C++,Opencv,Visual Studio 2015,Visual Studio Debugging,我不熟悉使用VisualStudio和openCv编程。我编写了一个简单的程序来显示图像的红色通道,但每次运行代码时,它都会抛出“调试断言失败”错误 这对我来说很好。我正在使用visual studio-2013 这里您有一个与您类似的案例,可能会有所帮助: 您是否绝对确定图像已正确加载 我认为它没有正确加载,因此向量rgb为空,反过来,元素rgb[0]不存在,从而触发异常 我注意到了几件事: 对include语句使用斜杠(/),而不是反斜杠(\),即 不要假设image.data设置为NULL

我不熟悉使用VisualStudio和openCv编程。我编写了一个简单的程序来显示图像的红色通道,但每次运行代码时,它都会抛出“调试断言失败”错误


这对我来说很好。我正在使用visual studio-2013

这里您有一个与您类似的案例,可能会有所帮助:

您是否绝对确定图像已正确加载

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

我注意到了几件事:

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

    不要假设
    image.data
    设置为
    NULL
    nullptr
    为空图像。取而代之的是检查

    if (!image.empty()) { ... }
    
  • 请确保在调用
    cv::imshow(…)
    之后,再调用
    cv::waitKey(/*延迟毫秒或0等待用户输入*/)
    ,参见中的注释

  • while(1)--这是故意的吗?您想要的可能是
    cv::waitKey(0)
    (请参见3.)

  • 更新:

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

    vector<Mat> rgb(image.channels());
    split(image, rgb);
    // ...
    
    矢量rgb(image.channels()); 分割(图像,rgb); // ...
  • 更新2:

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

    三件事:

  • std::vector
    的默认构造函数创建一个空向量
  • 显然,
    cv::split()
    期望调用者(即您)为输出分配数据。如果你不这样做,很可能会引发一场灾难
  • 对于调试构建,一些编译器在内存中的对象周围添加了填充或安全内存,这些对象永远不会被触及。如果这个填充内存在运行时被更改,程序“知道”发生了不好的事情,并抛出一个与您看到的异常类似的异常
    我做了你说的所有更正。但现在,当我最后按一个键退出时,它显示调试断言失败。更新rgb对我来说很有效。你能告诉我这个错误到底是什么意思吗?再次更新了我的答案。这回答了你的问题吗?
    #include <opencv2\core.hpp> // Bad!
    #include <opencv2/core.hpp> // Good!
    
    if (!image.data) { ... } 
    
    if (!image.empty()) { ... }
    
    vector<Mat> rgb(image.channels());
    split(image, rgb);
    // ...