OpenCV使用Mat存图像,有专门的图像格式。
命名规则
通用的参数命名格式为:
CV_{元素比特数}{元素类型}C{通道数}
例如,最常见的 CV_8UC3 中:
- 8U:8bit unsigned ;
- C3:通道数为 3 。
因此,
- CV_8UC3 就表示为 3通道Unsigned 8bits 格式的矩阵,也就是我们常说的 BGR3通道 。
类似的还有:CV_8UC1,CV_8UC2,CV_8UC3 等。 - 有些图片存储格式是 32位float ,则对应的图像格式为:CV_32FC1,CV_32FC2,CV_32FC3 等;
- 如果图片存储格式是 64位double ,则对应的图像格式为:CV_64FC1,CV_64FC2,CV_64FC3 等。
int值映射关系
矩阵元素的数据类型也可用不同的 int 值来替代,其对应关系如下表:
通道数 | C1 | C2 | C3 | C4 |
---|---|---|---|---|
CV_8U | 0 | 8 | 16 | 24 |
CV_8S | 1 | 9 | 17 | 25 |
CV_16U | 2 | 10 | 18 | 26 |
CV_16S | 3 | 11 | 19 | 27 |
CV_32S | 4 | 12 | 20 | 28 |
CV_32F | 5 | 13 | 21 | 29 |
CV_64F | 6 | 14 | 22 | 30 |
7
之所以被跳过了,是因为该数字专门留给用户自定义:
#define CV_USRTYPE1 7
取值范围
数值 | 具体类型 | 取值范围 |
---|---|---|
CV_8U | 8 位无符号整数 | 0 ~ 255 |
CV_8S | 8 位符号整数 | -128 ~ 127 |
CV_16U | 16 位无符号整数 | 0 ~ 65535 |
CV_16S | 16 位符号整数 | -32768 ~ 32767 |
CV_32S | 32 位符号整数 | -2147483648 ~ 2147483647 |
CV_32F | 32 位浮点数 | -FLT_MAX ~ FLT_MAX,INF,NAN |
CV_64F | 64 位浮点数 | -DBL_MAX ~ DBL_MAX,INF,NAN |
at所访问的数据类型
由于 at 方法接受的是 uchar 这样的数据类型,而非 CV_8U。
若是要使用 at 方法访问数据元素,在已知通道数和每个通道数据类型的情况下,指定给 at 方法的数据类型如下表所示:
C1 | C2 | C3 | C4 | C6 | |
---|---|---|---|---|---|
uchar | uchar | cv::Vec2b | cv::Vec3b | cv::Vec4b | |
short | short | cv::Vec2s | cv::Vec3s | cv::Vec4s | |
int | int | cv::Vec2i | cv::Vec3i | cv::Vec4i | |
float | float | cv::Vec2f | cv::Vec3f | cv::Vec4f | cv::Vec6f |
double | double | cv::Vec2d | cv::Vec3d | cv::Vec4d | cv::Vec6d |
其中,
- Vec2b:表示每个Vec2b对象中,可以存储2个char(字符型)数据
- Vec3b:表示每一个Vec3b对象中,可以存储3个char(字符型)数据,比如可以用这样的对象,去存储RGB图像中的
- Vec4b:表示每一个Vec4b对象中,可以存储4个字符型数据,可以用这样的类对象去存储—4通道RGB+Alpha的图
对应的 Vec类 的定义如下:
template<typename _Tp, int n> class Vec : public Matx<_Tp, n, 1> {...};
typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;
typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;
typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;
typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;
参考文献
[1] Interface
[2] LIST OF MAT TYPE IN OPENCV
[3] CV_8UC1,CV_8UC2,CV_8UC3 Vec2b Vec3b Vec4b 含义
[4] 确定 OpenCV 矩阵元素的数据类型