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文件。
答案 0 :(得分:5)
正如错误消息所示,您有一个失败的OpenCV运行时断言。
正如您在问题中所写,失败的断言位于Mat::at
函数内。
您必须在代码中找到导致错误的Mat::at
的来电(或来电)。
正如您在OpenCV help page Mat::at
看到的是一个带有一个,两个或三个参数的模板函数,断言失败可能有多种原因:
template<typename T> T& Mat::at(int i, int j)
时,i
应该介于0
之间且行数减1,假设j
在0
和列数减1之间。如果您有一个包含100行的图像并且您要求第101行的元素,则断言将失败。 Off-by-one errors在这种情况下很常见。更具体地说,断言失败了,因为以下bool
中至少有一个是false
:
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())
上述bool
在Mat
类的范围内有意义。
此外请注意帮助说:
为了提高性能,仅进行索引范围检查 在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 。