现在的位置: 首页 > 综合 > 正文

opencv 宏

2018年04月27日 ⁄ 综合 ⁄ 共 2038字 ⁄ 字号 评论关闭

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,一般07,CV_8UCV_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的值为063,占用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)

 

2CV_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_MASK511,十六进制为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位以内。

 

3CV_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

抱歉!评论已关闭.