OpenCV:Matrix type矩阵类型宏定义探究
作者:Eswai (eswai@foxmail.com)
问题描述
在进行OpenCV开发时,我们经常会遇到矩阵类型转换的陷阱,例如cv::cvtColor()颜色空间转换函数只适用于8位、16位、32位图。老司机可能会知道CV_8UC3=16,CV_32FC3=21,那么这些数字到底怎么算呢?
探索宏定义
- 基本类型
#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
为了方便描述,我们设基本类型函数为Basic(x),x=8U,8S,…64F,USRTYPE1,对应函数值Basic(x)=0,1,…,6,7.
2. 辅助设定
#define CV_CN_MAX 512
#define CV_CN_SHIFT 3
#define CV_DEPTH_MAX (1 << CV_CN_SHIFT)
// = (1 << 3) = 8,即 1 左移3位
- 计算规则
#define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1)
// = (8-1) = 7
#define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK)
// = flags & 7
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
// = (depth & 7) + ((cn-1) << 3)
#define CV_MAKE_TYPE CV_MAKETYPE
我们把矩阵类型CV_(x)C(y)设为Type(x,y),有
Type(x,y)=Basic(x)&7+(y−1)<<3=Basic(x)&7+8(y−1)
也就是说把基本类型作为后三位,通道数作为高位
4. 常用矩阵类型总结
基本类型 | C1(或留空) | C2 | C3 | C(n) |
---|---|---|---|---|
CV_8U | 0 | 8 | 16 | 8(n-1) |
CV_8S | 1 | 9 | 17 | 8(n-1)+1 |
CV_16U | 2 | 10 | 18 | 8(n-1)+2 |
CV_16S | 3 | 11 | 19 | 8(n-1)+3 |
CV_32S | 4 | 12 | 20 | 8(n-1)+4 |
CV_32F | 5 | 13 | 21 | 8(n-1)+5 |
CV_64F | 6 | 14 | 22 | 8(n-1)+6 |
其中C(k)表示有k个通道