cv::Mat type 宏值:
C1 C2 C3 C4
CV_8U 0 8 16 24
CV_8S 1 9 17 25
CV_16U 2 10 18 26
CV_16S 3 11 19 27
CV_32S 4 12 20 28
CV_32F 5 13 21 29
CV_64F 6 14 22 30如果不关心channel的数量的话,可以用:
cv::Mat mat;
int type = mat.type() % 8
// %8 其实就是等价于取最后3bit,即
int type = mat.type() & 0x07来获取mat中每个值的数据类型。
从编码方式来理解 type
type = (depth & CV_MAT_DEPTH_MASK) | ((cn - 1) << CV_CN_SHIFT)CV_MAT_DEPTH_MASK= 0x07CV_CN_SHIFT= 3
type 由两个信息决定:
- depth,即位宽,即用多少 bit 表示一个数
- channel,即通道数
opencv 一共定义了 7 种 depth:CV_8U、CV_8S、…、CV_64F。用 3 个 bit 就能完全表示。于是就把通道个数往左移三位就不会与depth信息发生重叠了,很容易就能将 depth 和 channel 信息从 type 分离出来。即:
uchar depth = type & CV_MAT_DEPTH_MASK;
uchar chans = 1 + (type >> CV_CN_SHIFT);写在最后
从中可以学习到如何将多个信息编码成一个变量,和相应的解码方式。