C++,cv::Mat数据类型、通道数等概念梳理

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值

见上述代码

相关推荐
江畔柳前堤4 小时前
信号的本质——从模拟波形到AI中的数据张量
人工智能·深度学习·机器学习·计算机视觉·数据挖掘·语音识别
小王C语言4 小时前
【7. 实现登录注册模块】:实现会话管理、注册/登录/退出 API
网络·c++
江畔柳前堤5 小时前
系统的本质——从LTI系统到神经网络
人工智能·深度学习·神经网络·机器学习·计算机视觉·数据挖掘·语音识别
峥无7 小时前
C++11 深度详解:现代 C++ 基石全梳理
开发语言·c++·笔记
阿米亚波7 小时前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl
小王C语言8 小时前
【3. 基于 Vibe Coding 的 OJ 平台】. 构建仓库、环境准备、需求梳理、安装依赖
网络·c++
小王C语言8 小时前
【8.进行接口测试】:通过 curl 进行接口自动化测试 / 通过 python 程序进行接口自动化测试
网络·c++
sali-tec9 小时前
C# 基于OpenCv的视觉工作流-章98-频域滤波
图像处理·人工智能·opencv·计算机视觉
888CC++9 小时前
C++ 快速学习指南:从入门到进阶的实战路线
开发语言·c++
小小晓.9 小时前
C++记:函数
开发语言·c++·算法