OpenCV错误:断言失败,mat.cpp第537行

时间:2013-11-26 12:24:41

标签: c++ opencv image-processing computer-vision

http://pastebin.com/5ZeMvm2C是我项目中的头文件。

在第249行有skeleton.at(yaxis,xaxis + 1)。当我在我的项目中输入此代码时出现此错误:

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

// mat.cpp line 537 is:
    template<typename _Tp> inline _Tp& Mat::at(int i0, int i1)
        {
            CV_DbgAssert( dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] &&
                (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) &&
                CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1());
            return ((_Tp*)(data + step.p[0]*i0))[i1];
        }

怎么了?

http://pastebin.com/gqJ5RpBU也是我的.cpp文件。

2 个答案:

答案 0 :(得分:5)

正如错误消息所示,您有一个失败的OpenCV运行时断言。

正如您在问题中所写,失败的断言位于Mat::at函数内。

您必须在代码中找到导致错误的Mat::at的来电(或来电)。

正如您在OpenCV help page Mat::at看到的是一个带有一个,两个或三个参数的模板函数,断言失败可能有多种原因:

  1. 您使用的是错误的模板参数(例如参见Using Mat::at(i,j) in opencv for a 2-D Mat object
  2. 参数错误,例如在调用template<typename T> T& Mat::at(int i, int j)时,i应该介于0之间且行数减1,假设j0和列数减1之间。如果您有一个包含100行的图像并且您要求第101行的元素,则断言将失败。 Off-by-one errors在这种情况下很常见。
  3. 更具体地说,断言失败了,因为以下bool中至少有一个是false

    1. dims <= 2
    2. data
    3. (unsigned)i0 < (unsigned)size.p[0]
    4. (unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels())
    5. CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1())
    6. 上述boolMat类的范围内有意义。

      此外请注意帮助说:

        

      为了提高性能,仅进行索引范围检查   在Debug配置中执行

      所以在你的Release配置中你不会有失败的断言,但可能在某个地方崩溃。

      从您链接的来源,在我看来,您在Windows上,如果这是真的,如果您有Visual Studio,我建议您从源代码构建OpenCV,在{{1}内放置一个断点然后调试代码,以便查看以前Mat::at的内容bool

答案 1 :(得分:0)

Mat::at()方法已作为模板实现,在使用该函数之前必须知道图像的类型。

检查图像的通道。 对于单通道图像(8UC1),您应该按照以下方式操作图像像素:

image.at<uchar>(row, col) = 255; 

对于三通道彩色图像(8UC3),您应该使用如下的功能:

image.at<cv::Vec3b>(row, col)[channel] = 255;

如果频道没有问题,你应该检查 at(i, j)的参数,我提出行,j显示col。换句话说,我等于Point.y,j等于Point.x