【opencv】cv::Mat 图像格式 (Data Type)

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 值来替代,其对应关系如下表:

通道数C1C2C3C4
CV_8U081624
CV_8S191725
CV_16U2101826
CV_16S3111927
CV_32S4122028
CV_32F5132129
CV_64F6142230

7之所以被跳过了,是因为该数字专门留给用户自定义:

#define CV_USRTYPE1 7

取值范围

数值具体类型取值范围
CV_8U8 位无符号整数0 ~ 255
CV_8S8 位符号整数-128 ~ 127
CV_16U16 位无符号整数0 ~ 65535
CV_16S16 位符号整数-32768 ~ 32767
CV_32S32 位符号整数-2147483648 ~ 2147483647
CV_32F32 位浮点数-FLT_MAX ~ FLT_MAX,INF,NAN
CV_64F64 位浮点数-DBL_MAX ~ DBL_MAX,INF,NAN

at所访问的数据类型

由于 at 方法接受的是 uchar 这样的数据类型,而非 CV_8U。
若是要使用 at 方法访问数据元素,在已知通道数和每个通道数据类型的情况下,指定给 at 方法的数据类型如下表所示:


C1C2C3C4C6
ucharucharcv::Vec2bcv::Vec3bcv::Vec4b
shortshortcv::Vec2scv::Vec3scv::Vec4s
intintcv::Vec2icv::Vec3icv::Vec4i
floatfloatcv::Vec2fcv::Vec3fcv::Vec4fcv::Vec6f
doubledoublecv::Vec2dcv::Vec3dcv::Vec4dcv::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 矩阵元素的数据类型

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值