opencv Mat 数据类型总结

来源:互联网 发布:陈怡馨被迷 知乎 编辑:程序博客网 时间:2024/06/05 19:36

      做图像信息统计的时候,用到了Mat,刚开始默认设置了 CV_8UC1 ,但程序运行后,统计的信息是在是过于小了,经过调试查看,发现总是在255这断了,重新来过,所以,想到了是不是Mat中定义数据类型出现了问题。果然,在查找网上的文章后,发现类型定义错误,导致数据的重0性。看了博主们的的文章,特做以下归纳。

Mat的常见属性

  • data  uchar型的指针。Mat类分为了两个部分:矩阵头和指向矩阵数据部分的指针,data就是指向矩阵数据的指针。
  • dims 矩阵的维度,例如5*6矩阵是二维矩阵,则dims=2,三维矩阵dims=3.
  • rows  矩阵的行数
  • cols   矩阵的列数
  • size 矩阵的大小,size(cols,rows),如果矩阵的维数大于2,则是size(-1,-1)
  • channels 矩阵元素拥有的通道数,例如常见的彩色图像,每一个像素由RGB三部分组成,则channels = 3

下面的几个属性是和Mat中元素的数据类型相关的。

  • type 
    表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数)。具体的有以下值: 
    CV_8UC1CV_8UC2CV_8UC3CV_8UC4CV_8SC1CV_8SC2CV_8SC3CV_8SC4CV_16UC1CV_16UC2CV_16UC3CV_16UC4CV_16SC1CV_16SC2CV_16SC3CV_16SC4CV_32SC1CV_32SC2CV_32SC3CV_32SC4CV_32FC1CV_32FC2CV_32FC3CV_32FC4CV_64FC1CV_64FC2CV_64FC3CV_64FC4
    这里U(unsigned integer)表示的是无符号整数,S(signed integer)是有符号整数,F(float)是浮点数。 
    例如:CV_16UC2,表示的是元素类型是一个16位的无符号整数,通道为2. 
    C1,C2,C3,C4则表示通道是1,2,3,4 
    type一般是在创建Mat对象时设定,如果要取得Mat的元素类型,则无需使用type,使用下面的depth
  • depth 
    矩阵中元素的一个通道的数据类型,这个值和type是相关的。例如 type为 CV_16SC2,一个2通道的16位的有符号整数。那么,depth则是CV_16S。depth也是一系列的预定义值, 
    将type的预定义值去掉通道信息就是depth值: 
    CV_8U CV_8S CV_16U CV_16S CV_32S CV_32F CV_64F
  • elemSize 
    矩阵一个元素占用的字节数,例如:type是CV_16SC3,那么elemSize = 3 * 16 / 8 = 6 bytes
  • elemSize1 
    矩阵元素一个通道占用的字节数,例如:type是CV_16CS3,那么elemSize1 = 16  / 8 = 2 bytes = elemSize / channels


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.



TIPS:
A Mapping of Type to Numbers in OpenCV

C1C2C3C4CV_8U081624CV_8S191725CV_16U2101826CV_16S3111927CV_32S4122028CV_32F5132129CV_64F6142230

Unsigned 8bits uchar 0~255
IplImage: IPL_DEPTH_8U
Mat: CV_8UC1, CV_8UC2, CV_8UC3, CV_8UC4

Signed 8bits char -128~127
IplImage: IPL_DEPTH_8S
Mat: CV_8SC1,CV_8SC2,CV_8SC3,CV_8SC4

Unsigned 16bits ushort 0~65535
IplImage: IPL_DEPTH_16U
Mat: CV_16UC1,CV_16UC2,CV_16UC3,CV_16UC4

Signed 16bits short -32768~32767
IplImage: IPL_DEPTH_16S
Mat: CV_16SC1,CV_16SC2,CV_16SC3,CV_16SC4

Signed 32bits int -2147483648~2147483647
IplImage: IPL_DEPTH_32S
Mat: CV_32SC1,CV_32SC2,CV_32SC3,CV_32SC4

Float 32bits float -1.18*10-38~3.40*10-38 
IplImage: IPL_DEPTH_32F
Mat: CV_32FC1,CV_32FC2,CV_32FC3,CV_32FC4

Double 64bits double 
Mat: CV_64FC1,CV_64FC2,CV_64FC3,CV_64FC4

Unsigned 1bit bool
IplImage: IPL_DEPTH_1U



http://www.cnblogs.com/wangguchangqing/p/4016179.html

http://blog.sina.com.cn/s/blog_662c7859010105za.html

0 0
原创粉丝点击