OpenCV3:通道和位深的理解含义整理(CV_8UC1,CV_8SC1,CV_32FC1)| opencv cv::Mat数据类型

矩阵数据类型:
– CV_<bit_depth>(S|U|F)C<number_of_channels>
S = 符号整型 U = 无符号整型 F = 浮点型

CV_8UC1 是指一个8位无符号整型单通道矩阵,
CV_32FC2是指一个32位浮点型双通道矩阵
CV_8UC1 CV_8SC1 CV_16U C1 CV_16SC1
CV_8UC2 CV_8SC2 CV_16UC2 CV_16SC2
CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3
CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4
CV_32SC1 CV_32FC1 CV_64FC1
CV_32SC2 CV_32FC2 CV_64FC2
CV_32SC3 CV_32FC3 CV_64FC3
CV_32SC4 CV_32FC4 CV_64FC4

其中,通道表示每个点能存放多少个数,类似于RGB彩色图中的每个像素点有三个值,即三通道的。
图片中的深度表示每个值由多少位来存储,是一个精度问题,一般图片是8bit(位)的,则深度是8.

1–bit_depth—比特数—代表8bite,16bites,32bites,64bites—举个例子吧–比如说,如
如果你现在创建了一个存储–灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张
灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位–所以它对
应的就是CV_8
2–S|U|F–S--代表—signed int—有符号整形
U–代表–unsigned int–无符号整形
F–代表–float---------单精度浮点型

3–C<number_of_channels>----代表—一张图片的通道数,比如:
1–灰度图片–grayImg—是–单通道图像
2–RGB彩色图像---------是–3通道图像
3–带Alph通道的RGB图像–是--4通道图像


opencv cv::Mat数据类型总结
在以下两个场景中使用OpenCV时,我们必须事先知道矩阵元素的数据类型:

使用 at 方法访问数据元素的时候要指明数据类型
做数值运算的时候,比如究竟是整数除法还是浮点数除法。
cv::Mat 类的对象有一个成员函数type()用来返回矩阵元素的数据类型,

返回值是 int 类型,不同的返回值代表不同的类型,具体对应关系如下所示:

类型C1C2C3C4
CV_8U081624
CV_8U191725
CV_8U2101826
CV_8U3111927
CV_8U4122028
CV_8U5132129
CV_8U6142230

表头的 C1, C2, C3, C4 指的是通道(Channel)数,例如:

灰度图像只有 1 个通道,是 C1;

JPEG格式 的 RGB 彩色图像就是 3 个通道,是 C3

PNG 格式的彩色图像除了 RGB 3个通道外,还有一个透明度通道,所以是 C4。

如果仅仅是为了在数值计算前明确数据类型,那么看到这里就可以了

如果是要使用 at 方法访问数据元素,那么还需要下面一步

因为以单通道为例,at 方法接受的是 uchar 这样的数据类型,而非 CV_8U。

在已知通道数和每个通道数据类型的情况下,指定给 at 方法的数据类型如下表所示:

类型C1C2C3C4C6
ucharucharcv::Vec2bcv::Vec3bcv::Vec4b
shortshortcv::Vec2scv::Vec3scv::Vec4b
intintcv::Vec2icv::Vec3icv::Vec4i
floatfloatcv::Vec2fcv::Vec3fcv::Vec4fcv::Vec6f
doubledoublecv::Vec2dcv::Vec3dcv::Vec4dcv::Vec6f

现在,就可以使用at来访问图像的像素了:

    cv::Vec3b vec3b = img.at<cv::Vec3b>(0,0);
    uchar vec3b0 = img.at<cv::Vec3b>(0,0)[0];
    uchar vec3b1 = img.at<cv::Vec3b>(0,0)[1];
    uchar vec3b2 = img.at<cv::Vec3b>(0,0)[2];
    std::cout<<"vec3b = "<<vec3b<<std::endl;
    std::cout<<"vec3b0 = "<<(int)vec3b0<<std::endl;
    std::cout<<"vec3b1 = "<<(int)vec3b1<<std::endl;
    std::cout<<"vec3b2 = "<<(int)vec3b2<<std::endl;

上述数据类型以及取值范围

在这里插入图片描述
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
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值