CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1())解释

opencv中经常会碰见CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1());这类问题。
Tp& Mat::at(int i0, int i1)
{
//1.如果维度越界
CV_DbgAssert(dims <= 2);
//2.如果数据为空
CV_DbgAssert(data);
//3.如果i0越界
CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
//4.如果i1越界
CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));
//5.elemSize1为Mat中一个通道中一个元素的所占内存大小的值。
CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1());
//6.返回该点对应的值
return ((_Tp*)(data + step.p[0] * i0))[i1];
}
首先,这个断言官方的解释是只在调试阶段运行,在发布版本不运行,但是很有可能会引起程序的崩溃。
主要的目的就是防止越界。
这里共有5个断言,只要断言的表达式为false就会终止程序。逐条来解释一下:
1.CV_DbgAssert(dims <= 2);很显然这是一个二维矩阵,如果矩阵的维度大于2就会断言。
2.CV_DbgAssert(data); 如果数据为空,传过来的矩阵数据为空
3. CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);行参数i0越界,P【0】为Mat中的梯级,P【0】代表着
第一级,在这个二维矩阵中,P【0】就为矩阵中一行数据在内存中占的大小。size嘛大概意思也就是一行的
大小。
4.CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));同理,这个是判
段i1参数是否越界。具体嘛,没搞明白,反正C++那么多坑,就没必要深挖了。功能明白了就好。
5.CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1());这个嘛,估计是和我一样碰 到 最多的一个了。这句话的意思是判断类型是否合适。
比如H.at(2, 2) = Z这么一个语句来说就是,判断double这个类型和H矩阵存储类型是否相同。
经常会发生你的矩阵类型是CV_64F,你却写了H.at(2, 2) = Z他也会报错。忘了:elemSize1是矩阵中一个像素一个通道的一个元素在内存中占的大小。elemSize是多个通道叠加大小。

内容解释参考:https://blog.csdn.net/weixin_43213208/article/details/84617183

你可能感兴趣的:(C/opencv,计算机视觉)