文章目录
一、Mat类的类型CV_8UC1
1.CV_8UC1
用处:指定深度和通道数
(1)格式
CV_<depth深度><符号类型>C<cn通道数>
(2)意思
①深度的位数
取值是8
,16
,32
,64
这个就是存储的二进制位数
②符号类型
只有三个值:S
,U
,F
- S:signed int 有符号整形
- U:unsigned int 无符号整形
- F:float 单精度浮点型
③C
表示通道,写出来只是为了分割前后两个数字,以免混淆。
④cn通道数
取值可以是1
,2
,3
,4
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 char ,uchar ,uint8_t |
CV_8S | char ,int8_t |
CV_16U | ushort |
CV_16S | short |
CV_32S | int |
CV_32F | float |
CV_64F | double |
(4)常用的
CV_8UC1
:深度8位的无符号整型(U
),通道数为1CV_8UC3
:深度8位的无符号整型(U
),通道数为3CV_32FC1
:深度32位的单精度浮点型(F
),通道数为1CV_32FC3
:深度32位的单精度浮点型(F
),通道数为3
(5)映射图像
imshow()
函数在显示图像时,会将各种类型的数据都映射到[0, 255]
。不能显示2通道的图像,1,3,4都可以
如果载入的图像是:
CV_8U
- 8-bit unsigned integers ( 0…255 ),,即就显示图像本来的样子。CV_8S
- 8-bit signed integers ( -128…127 )CV_16U
- 16-bit unsigned integers ( 0…65535 ),,则便用像素值除以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 ),,则像素值便要乘以255CV_64F
- 64-bit floating-point numbers ( -DBL_MAX…DBL_MAX, INF, NAN )
2.CV_8U
(1)用处1:只指定深度类型
有的地方只需要深度类型,比如卡尔曼滤波KalmanFilter
的void 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之通道的理解
来源:CSDN
作者:sandalphon4869
链接:https://blog.csdn.net/sandalphon4869/article/details/103840156