cpp
// 概念梳理
// 矩阵的完整类型 = CV_ + 位深 + 数据类型 + C + 通道数
// e.g.1 CV_32FC3: 32位float型矩阵,通道数为3
// e.g.2 CV_8UC1: 8位uchar型矩阵,通道数为1
// e.g.3 CV_64F: 等价于CV_64FC1 (前者是简写),即64位double型矩阵,通道数为1
// 假设存在一个float型单通道矩阵
cv::Mat mat = cv::Mat::zeros(2, 2, CV_32FC3);
mat.depth() // 返回矩阵的数据类型, 如此处返回 CV_32F (int值)
mat.channels() // 返回矩阵的通道数, 如此处返回 3 (int值)
mat.type() // 返回矩阵的完整类型, = 数据类型+通道数, 如此处返回 CV_32FC3 (int值)
mat.convertTo(mat, CV_64F); // 处理后mat的完整类型是CV_64FC3
// 也就是说,.convertTo函数第二个参数传入的是数据类型(位深)而不是完整类型
// 也就是说,.convertTo函数只能转换数据类型而不能改变通道数
// 由type()值换算出depth()值和channels()值
int type = mat.type();
int depth = type & 7;
int channels = (type >> 3) + 1;
// 由depth()值和channels()值计算type()值
type = depth + (channels-1)*8
附1:depth 可能存在的值即意义
| 数字 | 宏定义 | 数据类型 |
|---|---|---|
| 0 | CV_8U | uchar / 无符号 8 位 |
| 1 | CV_8S | char / 有符号 8 位 |
| 2 | CV_16U | unsigned short |
| 3 | CV_16S | short |
| 4 | CV_32S | int |
| 5 | CV_32F | float |
| 6 | CV_64F | double |
附2:常见type值即对应depth和channels
|-----------------|----------|---------|---------|
| 数据类型 | C1 (单通道) | C3(三通道) | C4(四通道) |
| CV_8U (uchar) | 0 | 16 | 24 |
| CV_32S (int) | 4 | 20 | 28 |
| CV_32F (float) | 5 | 21 | 29 |
| CV_64F (double) | 6 | 22 | 30 |
附3:depth值和channels值,计算type值
附4:type值分解成depth值和channels值
见上述代码