OpenCV3之Mat类的类型type和深度depth

一个人想着一个人 提交于 2020-01-06 14:38:36


一、Mat类的类型CV_8UC1

1.CV_8UC1

用处:指定深度和通道数

(1)格式

CV_<depth深度><符号类型>C<cn通道数>

(2)意思

①深度的位数

取值是8163264
这个就是存储的二进制位数

②符号类型

只有三个值:SUF

  • S:signed int 有符号整形
  • U:unsigned int 无符号整形
  • F:float 单精度浮点型

C

表示通道,写出来只是为了分割前后两个数字,以免混淆。

④cn通道数

取值可以是1234

  • 1:单通道图像,即灰度图片
  • 2:2通道图像,傅里叶变化会用到
  • 3:3通道图像,即RGB彩色图像
  • 4:4通道图像,即带Alph通道的RGB图像。
    PNG图像是一种典型的4通道图像。alpha通道可以赋值0到1,或者0到255,表示透明到不透明。

(3)深度类型depth()

#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

可以用函数int Mat::depth()获得。

Mat A(3,4,CV_8UC3);
cout << A.depth() << endl;
// 0

Mat B(3,4,CV_32FC1);
cout << B.depth() << endl;
// 5

深度类型对应单位

深度类型 单位
CV_8U unsigned charucharuint8_t
CV_8S charint8_t
CV_16U ushort
CV_16S short
CV_32S int
CV_32F float
CV_64F double

(4)常用的

  • CV_8UC1:深度8位的无符号整型(U),通道数为1
  • CV_8UC3:深度8位的无符号整型(U),通道数为3
  • CV_32FC1:深度32位的单精度浮点型(F),通道数为1
  • CV_32FC3:深度32位的单精度浮点型(F),通道数为3

(5)映射图像

imshow()函数在显示图像时,会将各种类型的数据都映射到[0, 255]。不能显示2通道的图像,1,3,4都可以
如果载入的图像是:

  • CV_8U - 8-bit unsigned integers ( 0…255 ),[0,28]=[0,255][0,2^8]=[0,255],即就显示图像本来的样子。
  • CV_8S - 8-bit signed integers ( -128…127 )
  • CV_16U - 16-bit unsigned integers ( 0…65535 ),[0,216]=[0,255×256][0,2^16]=[0,255\times 256],则便用像素值除以256。
  • CV_16S - 16-bit signed integers ( -32768…32767 )
  • CV_32S - 32-bit signed integers ( -2147483648…2147483647 )
  • CV_32F - 32-bit floating-point numbers ( -FLT_MAX…FLT_MAX, INF, NAN ),[0,1.0][0,1.0],则像素值便要乘以255
  • CV_64F - 64-bit floating-point numbers ( -DBL_MAX…DBL_MAX, INF, NAN )

2.CV_8U

(1)用处1:只指定深度类型

有的地方只需要深度类型,比如卡尔曼滤波KalmanFiltervoid init(int dynamParams, int measureParams, int controlParams=0, int type=CV_32F);

(2)等同于CV_XXC1

Mat中type函数输出的值:

  • 单通道时,就是对应相关depth()
  • 2个通道时,则相关depth()再加上8;
  • 3个通道时,则相关depth()再加上16;
  • 4个通道时,则相关depth()再加上24。

所以CV_8U等同于CV_8UC1

// 单通道
Mat A(2, 1, CV_8U);
cout << A.type() << endl;
// 0

// 双通道
Mat B(2, 1, CV_8UC2);
cout << B.type() << endl;
// 8

Reference:
学习OpenCV2——Mat之通道的理解


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!