OpenCV 错误断言在某些像素值上失败

Posted

技术标签:

【中文标题】OpenCV 错误断言在某些像素值上失败【英文标题】:OpenCV Error Assertion failed on some Pixal Values 【发布时间】:2013-10-13 15:11:29 【问题描述】:

我将图像加载到垫子上:

Mat Mask = cvLoadImage(filename);

它是 3744 X 5616 RGB 图像。在下一步中,我将其转换为灰度。

cvtColor(Mask,Mask,CV_BGR2GRAY);

在此之后,我将其标准化以稍后使用完整的灰度:

normalize(Mask,Mask,0,255,NORM_MINMAX,CV_8U);

现在我需要特定的灰度值并在某些值上出现错误:

for(int i=0;i<(Picture.rows);i++)

    for(int j=0;j<(Picture.cols);j++)
    
Vec3b  masked = Mask.at<Vec3b>(i,j);
//some stuff


我在某些像素上收到以下错误:

OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] && (unsigned)i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) && ((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3) - 1))*4) & 15) == elemSize1()) in unknown function, file c:\opencv\build\include\opencv2\core\mat.hpp, line 537

谁能告诉我我做错了什么?奇怪的是它只出现在某些像素值上

编辑: 附加信息: 如果我将我的蒙版加载为灰度,一切正常。但是当我使用 cvtColor() 或 Mat Mask = imread(filename,CV_LOAD_IMAGE_GRAYSCALE);在图像上出现错误。好奇怪……

【问题讨论】:

疯狂猜测 - 是原始图像中的最小/最大像素吗? 遗憾的是没有。这也是我的第一个猜测。在原始图像中,当第一行出现错误时,这些值在 196-200 左右并在 211-216 左右标准化。原件的最大值为 237,标准化后为 255。 【参考方案1】:

我认为您的问题是您正在使用.at&lt;Vec3b&gt;(i,j) 访问二进制图像。相反,您想使用.at&lt;uchar&gt;(i,j) 访问每个像素。 cvtColor(Mask,Mask,CV_BGR2GRAY); 将 3 通道 BGR 图像更改为单通道灰度图像。 .at&lt;Vec3b&gt;(i,j) 正在尝试访问 3 通道图像,该图像最终将超过内存中图像数组的末尾,从而导致问题或触发这些断言。

for 循环的内部应该如下所示:

unsigned char masked = Mask.at<uchar>(i,j);

【讨论】:

以上是关于OpenCV 错误断言在某些像素值上失败的主要内容,如果未能解决你的问题,请参考以下文章

图像处理 opencv 3.0 断言失败错误

OPENCV / C++: approxpolydp 断言失败错误

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

OpenCV 错误:使用 calcHist 断言失败

为啥我会收到此 OpenCV 错误断言失败?

OpenCV 错误:使用 fitLine 时断言失败