opencv中Mat的断言问题

opencv中Mat的断言问题

  • OpenCV中经常会碰见CV_DbAssert,来谈一谈opencv中Mat类的CV_DbAssert

OpenCV中经常会碰见CV_DbAssert,来谈一谈opencv中Mat类的CV_DbAssert

_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是多个通道叠加大小。
附上:
opencv中调用type函数返回值对应的含义。
opencv中Mat的断言问题_第1张图片
opencv中调用depth()的返回值代表的含义如下:
#define CV_8U 0
#define CV_8S 1
#define CV_16U 2
#define CV_16S 3
#define CV_32S 4
#define CV_32F 5
#define CV_64F 6
#define CV_USRTYPE1 7

在opencv中数据类型的对应。
Mat_对应的是CV_8U
Mat_对应的是CV_8S
Mat_对应的是CV_32S
Mat_对应的是CV_32F
Mat_对应的是CV_64F
这里我们就能明白H.at(2,2)==z;如果h的类型是cv——64f,因为在opencv中float对应的是32F。
参考:https://blog.csdn.net/github_30605157/article/details/79872549
https://blog.csdn.net/pekingFloater/article/details/82688327

你可能感兴趣的:(opencv中Mat的断言问题)