OpenCV Mat数据类型及位数总结

本文详细介绍了OpenCV中各种数据类型的内存占用、数值范围及其在图像处理中的应用。包括无符号和有符号整数类型、浮点数和双精度浮点数等,并列举了不同数据类型对应的CvMat和IplImage结构参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenCV Mat数据类型及位数总结

 

float:  4字节,6-7位有效数字 -3.4E-38 到 3.4E38    
double: 8字节,15~16位有效数字 -1.7E-308 到 1.7E308

    在OpenCV里面,许多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量,因此需要知道它们声明的空间大小来配置适当的变量。一 般标准的图片,为RGB格式它们的大小为8bits格式,范围为0~255,对一个int空间的类型来说实在是太小,整整浪费了24bits的空间,假设有个640*480的BMP文件空间存储內存,那整整浪费了640*480*3*(32-8)bits的內存空间,总共浪费了2.6MB!,也就是那 2.6MB内什么东西都没存储,如果今天以8bits的格式来存储则只使用到0.6MB的內存而已(640*480*3*(8)+54 bits),因此,对于文件格式的对应是一件很重要的事。
    在这边除了要考虑bits的空间大小外,还要考虑使用类型的正负号的问题,一般的图像文件是不存在负号的,如果今天即使选则正确的空间大小,可是出现的结果却是负的,那就功亏一篑了。这里除了Float及double类型,char,int,short int都是用二的补数表示法,它们不具正负号bit,而Float,double则是用IEEE 754,在第32bit,64bit上有一个正负号bit.

cvCreateImage()及cvCreateMat()对应

1.Unsigned 8bits(一般的图像文件格式使用的大小)
IplImage数据结构参数:IPL_DEPTH_8U
CvMat数据结构参数:CV_8UC1,CV_8UC2,CV_8UC3,CV_8UC4

变量类型空间大小范围其他
uchar 8bits 0~255 (OpenCV缺省变量,同等unsigned char)
unsigned char 8bits 0~255  

2.Signed 8bits
IplImage数据结构参数:IPL_DEPTH_8S
CvMat数据结构参数:CV_8SC1,CV_8SC2,CV_8SC3,CV_8SC4


变量类型空间大小范围其他
char 8bits -128~127  

3.Unsigned 16bits
IplImage数据结构参数:IPL_DEPTH_16U
CvMat数据结构参数:CV_16UC1,CV_16UC2,CV_16UC3,CV_16UC4

变量类型空间大小范围其他
ushort 16bits 0~65535 (OpenCV缺省变量,同等unsigned short int)
unsigned short int 16bits 0~65535 (unsigned short)

 

4.Signed 16bits
IplImage数据结构参数:IPL_DEPTH_16S
CvMat数据结构参数:CV_16SC1,CV_16SC2,CV_16SC3,CV_16SC4

变量类型空间大小范围其他
short int 16bits -32768~32767 (short)

 

5.Signed 32bits
IplImage数据结构参数:IPL_DEPTH_32S
CvMat数据结构参数:CV_32SC1,CV_32SC2,CV_32SC3,CV_32SC4

变量类型空间大小范围其他
int 32bits -2147483648~2147483647 (long)

6.Float 32bits

IplImage数据结构参数:IPL_DEPTH_32F
CvMat数据结构参数:CV_32FC1,CV_32FC2,CV_32FC3,CV_32FC4

变量类型空间大小范围其他
float 32bits 1.18*10-38~3.40*1038  

7.Double 64bits

CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3,CV_64FC4

变量类型空间大小范围其他
double 64bits 2.23*10-308~1.79*10308  

 

8.Unsigned 1bit

IplImage数据结构参数:IPL_DEPTH_1U


变量类型空间大小范围其他
bool 1bit 0~1  

 

其他变量对应

 

1.Signed 64bits

int64

long long

2.

Unsigned 64 bits
uint64

unsigned long long

原文来自:http://hi.baidu.com/zle_yuanfang/home

<think>好的,用户想了解Mat数据类型,首先我需要确定他们指的是哪个领域的Mat。通常来说,Mat可能是指OpenCV库中的矩阵数据结构,或者是MATLAB中的矩阵类型,也有可能是指其他数学或编程环境中的矩阵。考虑到常见的使用场景,用户可能是在学习计算机视觉或图像处理时遇到了OpenCVMat数据类型,所以先从OpenCV的角度来回答比较合理。 接下来,我需要明确用户的基础知识水平。如果他们刚接触图像处理,可能需要更基础的讲解,包括Mat的基本结构、用途以及如何操作。如果用户已经有一定经验,可能需要更深入的内容,比如内存管理、深拷贝与浅拷贝的区别等。但根据问题本身,用户可能属于初学者,所以应该从基础开始介绍。 然后,思考Mat的主要特点。在OpenCV中,Mat用于存储图像和矩阵数据,具有自动内存管理,支持多维数组,能够处理不同的数据类型和通道数。需要解释这些特点,并举例说明,比如如何创建一个Mat对象,如何访问和修改其中的数据。 另外,用户可能想知道为什么使用Mat而不是传统的IplImage,这里需要提到Mat的内存管理优势,避免内存泄漏,以及它如何简化代码。同时,要强调Mat的灵活性和效率,比如支持ROI(感兴趣区域)和高效的矩阵运算。 还要考虑到用户可能遇到的常见问题,例如深浅拷贝的区别。需要详细解释clone()和copyTo()方法的作用,以及直接赋值时的浅拷贝行为,避免用户在使用时出现错误。 此外,可能需要提到Mat数据类型,如CV_8U、CV_32F等,以及通道数的概念,这对处理彩色图像或特定数学运算很重要。同时,可以举例说明如何创建特定类型的Mat,并解释不同数据类型的应用场景。 最后,总结Mat的重要性,以及它在图像处理和计算机视觉任务中的核心地位,确保用户理解掌握Mat的必要性。还要检查是否遗漏了关键点,比如矩阵的维度、头信息与数据的分离等,确保回答全面准确。</think>Mat数据类型OpenCV计算机视觉库中用于存储矩阵数据的核心结构,尤其在图像处理、矩阵运算等领域广泛应用。以下是逐步解析: ### 1. 基础定义 Mat = **矩阵容器**(Matrix Container),其设计特点: - 存储多维数组(支持1D向量、2D图像、3D体数据) - 支持多种数据类型(整型/浮点型/复数等) - 自动内存管理(避免内存泄漏) ### 2. 核心组成 每个Mat对象包含两部分: ```cpp /* 伪代码表示 */ struct Mat { Header { // 元信息(尺寸/类型/引用计数) int rows, cols; int type; // 如CV_8UC3表示8位无符号3通道 int* refcount; // 智能指针引用计数 }; Data { // 实际像素/数值存储 uchar* ptr; // 指向连续内存块 }; }; ``` ### 3. 关键特性 - **浅拷贝**:默认赋值`Mat A=B`仅复制头信息,共享数据内存 - **深拷贝**:需显式调用`A = B.clone()`或`B.copyTo(A)` - **ROI操作**:通过`Mat ROI = A(Rect(x,y,w,h))`提取感兴趣区域 - **多通道支持**:如RGB图像用3通道Mat存储 ### 4. 数据类型标识 通过`CV_[位数][符号][类型]C[通道数]`定义: - `CV_8UC3`:8位无符号整型,3通道(典型BGR图像格式) - `CV_32FC1`:32位浮点型,单通道(常用于滤波计算) ### 5. 创建Mat示例 ```cpp // 创建3x3双精度浮点矩阵 Mat mat = (Mat_<double>(3,3) << 1,2,3, 4,5,6, 7,8,9); // 创建480x640的RGB图像容器 Mat img(480, 640, CV_8UC3, Scalar(255,0,0)); // 初始化为蓝色 ``` ### 6. 访问数据方法 - **指针访问**(高效但需注意越界): ```cpp for(int r=0; r<mat.rows; r++){ double* row = mat.ptr<double>(r); for(int c=0; c<mat.cols; c++){ row[c] = ...; // 直接修改元素 } } ``` - **at()方法**(安全但稍慢): $$ \text{pixelValue} = img.at<Vec3b>(y,x)[channel] $$ ### 7. 优势对比 | 特性 | 传统IplImage | Mat | |-----------|--------------------|---------------------| | 内存管理 | 手动释放 | 引用计数自动回收 | | 数据连续性 | 不一定连续 | 保证连续可优化SIMD指令 | | 多维度支持 | 仅支持2D | 支持任意维度 | ### 8. 典型应用场景 - 图像存储(灰度图/RGB图/深度图) - 矩阵运算(特征值分解、线性方程组求解) - 机器学习数据容器(特征向量集合) 掌握Mat数据结构的使用,是进行OpenCV图像处理、计算机视觉算法开发的基础核心技能。实际使用中需特别注意数据类型匹配和内存共享机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值