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


一、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 , 2 8 ] = [ 0 , 255 ] [0,2^8]=[0,255] ,即就显示图像本来的样子。
  • CV_8S - 8-bit signed integers ( -128…127 )
  • CV_16U - 16-bit unsigned integers ( 0…65535 ), [ 0 , 2 1 6 ] = [ 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之通道的理解


发布了411 篇原创文章 · 获赞 144 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/sandalphon4869/article/details/103840156