1、CV_MAKETYPE(depth,cn) 宏
作用:#define CV_MAKETYPE(depth,cn) 宏读入位深度depth和通道数cn生成矩阵类型type.
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
Depth的最大值为8,一般0到7,即CV_8U到CV_USRTYPE1:
#define CV_CN_SHIFT 3
#define CV_DEPTH_MAX (1 << CV_CN_SHIFT)
Cn为通道数,cn的最大值为64:
#define CV_CN_MAX 64
#define CV_MAKETYPE(depth,cn)将depth作低三位,cn-1作高6位(Cn-1的值为0到63,占用6位),形成type值,type最大可为9位:
#define CV_MAKETYPE(depth,cn) ((depth) + (((cn)-1) << CV_CN_SHIFT))
例如:
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
2、CV_MAT_TYPE(flags)宏
作用:CV_MAT_TYPE(flags)宏读入类型type,并将type规范化为9位的矩阵类型。
#define CV_CN_MAX 64
#define CV_CN_SHIFT 3
#define CV_DEPTH_MAX (1 << CV_CN_SHIFT)
#define CV_MAT_TYPE_MASK (CV_DEPTH_MAX*CV_CN_MAX - 1)
#define CV_MAT_TYPE(flags) ((flags) & CV_MAT_TYPE_MASK)
CV_MAT_TYPE_MASK为511,十六进制为0x1FF; CV_MAT_TYPE(flags)将flags截为9位,flags一般为type,所以CV_MAT_TYPE(flags)宏用来规范type值:type正常为9位,如果超过9位(比如将通道cn 定义为64以上),可用CV_MAT_TYPE(flags)宏将type 值规范为9位以内。
3、CV_MAT_CN(flags)宏
作用:CV_MAT_CN(flags)宏用来求矩阵类型flags的通道数
#define CV_MAT_CN_MASK ((CV_CN_MAX - 1) << CV_CN_SHIFT)
#define CV_MAT_CN(flags) ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1)
理解了CV_MAKETYPE(depth,cn) 宏就不难理解CV_MAT_CN(flags)宏了。
4、 CV_ELEM_SIZE(type)宏
作用:计算类型type的“通道数*位深度所占字节”值
#define CV_ELEM_SIZE(type) /
(CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3))
((sizeof(size_t)/4+1)*16384|0x3a50)的值为oxba50,其二进制值为1011,1010,0101,0000。(0xba50>>depth*2)&3的值见下表的第四列,经过该运算,具有相同位深度字节数的type有相同的(0xba50>>depth*2)&3值(如CV_8U和CV_8S结果都为00,CV_32S和CV_32F的结果都为10)。CV_ELEM_SIZE(type)为通道数向左移动”(0xba50>>depth*2)&3”个bit位,即通道数乘以2的”(0xba50>>depth*2)&3”次方,见下表第五列,可见,CV_8U和CV_8S所占字节为1,CV_32S和CV_32F所占字节为4。
depth | Value | depth*2 | (0xba50>>depth*2)&3 (二进制) | CV_ELEM_SIZE(type) |
CV_8U | 0 | 0 | 00 | cn*pow(2,0)=cn*1 |
CV_8S | 1 | 2 | 00 | cn*pow(2,0)=cn*1 |
CV_16U | 2 | 4 | 01 | cn*pow(2,1)=cn*2 |
CV_16S | 3 | 6 | 01 | cn*pow(2,1)=cn*2 |
CV_32S | 4 | 8 | 10 | cn*pow(2,2)=cn*4 |
CV_32F | 5 | 10 | 10 | cn*pow(2,2)=cn*4 |
CV_64F | 6 | 12 | 11 | cn*pow(2,3)=cn*8 |
CV_USRTYPE1 | 7 | 14 | 10 | cn*pow(2,2)=cn*4 |