我是使用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)
答案 0 :(得分:5)
您是否完全确定图像已正确加载?
我认为它没有被正确加载,因此向量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 */ )
,cf。 OpenCV reference。
while (1);
- 是故意的吗?你想要的可能是cv::waitKey( 0 )
(见3)。
<强>更新强>
确保向量rgb
已初始化为通道数,即
vector<Mat> rgb(image.channels());
split(image, rgb);
// ...
更新2:
你能告诉我这个错误究竟是什么意思吗?
三件事:
std::vector<T>
的默认构造函数会创建一个空向量。cv::split()
期望调用者(即你)为输出分配数据。如果你没有这样做,可能会引发segmentation fault。答案 1 :(得分:0)
它正在编译对我来说很好。我在视觉工作室 - 2013年。
这里你有一个类似于你的案例,也许它会有所帮助: debug-assertion-failed