OpenCV小试牛刀1——OPENCV宏

来源:互联网 发布:黑搜对淘宝号有影响吗 编辑:程序博客网 时间:2024/04/30 07:12

1. CV_MAKETYPE(depth,cn)

         #define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))这个宏用来读入位深度depth和通道数cn从而生成矩阵类型type。

        这里先解释一下矩阵数据类型type,我们经常会看到诸如Mat img = Mat::zeros(w, w, CV_8UC1);的语句,在该语句中我们用CV_8UC1来标识要生成的矩阵元素类型,zeros函数利识别该标识进而产生相应的数据类型。

        OpenCV中对矩阵的元素类型定义如下:

#define CV_CN_MAX     512#define CV_CN_SHIFT   3#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)#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#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))#define CV_MAKE_TYPE CV_MAKETYPE#define CV_8UC1 CV_MAKETYPE(CV_8U,1)#define CV_8UC2 CV_MAKETYPE(CV_8U,2)#define CV_8UC3 CV_MAKETYPE(CV_8U,3)#define CV_8UC4 CV_MAKETYPE(CV_8U,4)#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))#define CV_8SC1 CV_MAKETYPE(CV_8S,1)#define CV_8SC2 CV_MAKETYPE(CV_8S,2)#define CV_8SC3 CV_MAKETYPE(CV_8S,3)#define CV_8SC4 CV_MAKETYPE(CV_8S,4)#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))#define CV_16UC1 CV_MAKETYPE(CV_16U,1)#define CV_16UC2 CV_MAKETYPE(CV_16U,2)#define CV_16UC3 CV_MAKETYPE(CV_16U,3)#define CV_16UC4 CV_MAKETYPE(CV_16U,4)#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))#define CV_16SC1 CV_MAKETYPE(CV_16S,1)#define CV_16SC2 CV_MAKETYPE(CV_16S,2)#define CV_16SC3 CV_MAKETYPE(CV_16S,3)#define CV_16SC4 CV_MAKETYPE(CV_16S,4)#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))#define CV_32SC1 CV_MAKETYPE(CV_32S,1)#define CV_32SC2 CV_MAKETYPE(CV_32S,2)#define CV_32SC3 CV_MAKETYPE(CV_32S,3)#define CV_32SC4 CV_MAKETYPE(CV_32S,4)#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))#define CV_32FC1 CV_MAKETYPE(CV_32F,1)#define CV_32FC2 CV_MAKETYPE(CV_32F,2)#define CV_32FC3 CV_MAKETYPE(CV_32F,3)#define CV_32FC4 CV_MAKETYPE(CV_32F,4)#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))#define CV_64FC1 CV_MAKETYPE(CV_64F,1)#define CV_64FC2 CV_MAKETYPE(CV_64F,2)#define CV_64FC3 CV_MAKETYPE(CV_64F,3)#define CV_64FC4 CV_MAKETYPE(CV_64F,4)#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))


由上可知,CV_MAKETYPE(depth,cn) 在调用时,depth的取值为CV_8U,CV_8S,CV_16U...CV_USRTYPE1,对应为0,1,2...7;cn的取值为1,2,3,4...512,通过测试可知,

        CV_MAKETYPE(0,1) =0,CV_MAKETYPE(0,2) =8,CV_MAKETYPE(0,3) =16,CV_MAKETYPE(0,4) =24,CV_MAKETYPE(0,5) =32,...

        CV_MAKETYPE(1,1) =1,CV_MAKETYPE(1,2) =9,...

        CV_MAKETYPE(2,1) =2,CV_MAKETYPE(2,2) =10,...

        CV_MAKETYPE(3,1) =3,CV_MAKETYPE(3,2) =11,...

        CV_MAKETYPE(4,1) =4,CV_MAKETYPE(4,2) =12,...

        CV_MAKETYPE(5,1) =5,CV_MAKETYPE(5,2) =13,…

        CV_MAKETYPE(6,1) =6,CV_MAKETYPE(6,2) =14,…

        CV_MAKETYPE(7,1) =7,CV_MAKETYPE(7,2) =15,…

        CV_8UC1   =0,CV_8UC2   =8,CV_8UC3   =16,CV_8UC4   =24,CV_8UC5   =32,…

        CV_8SC1   =1,CV_8SC2   =9,…

        CV_16UC1=2,CV_16UC2=10,…

        CV_16SC1=3,CV_16SC2=11,…

        CV_32SC1=4,CV_32SC2=12,…

        CV_32FC1=5,CV_32FC2=13,…

        CV_64FC1=6,CV_64FC2=14,…

0~7——000~111,8~15——1000~1111,16~23——10000~10111,…低三位的变化对应depth的变化,高位的变化对应通道数cn的变化。

所以,每一种数据类型都用一个唯一的整数来标志,函数通过识别该整数,生成相应数据类型。另外由上述可知,depth用低三位表示,通道数cn最大值为512,0~511,用高9位表示。


0 0