调试断言失败 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
设置为 NULL
或 nullptr
用于空图像。而是检查
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<T>
的默认构造函数会创建一个 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)