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

OpenCV的一些宏

2013年10月02日 ⁄ 综合 ⁄ 共 2015字 ⁄ 字号 评论关闭

1CV_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_8UCV_8S结果都为00CV_32SCV_32F的结果都为10)。CV_ELEM_SIZE(type)为通道数向左移动”(0xba50>>depth*2)&3”bit,即通道数乘以2”(0xba50>>depth*2)&3”次方,见下表第五列,可见,CV_8UCV_8S所占字节为1,CV_32SCV_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

抱歉!评论已关闭.