查看原文
其他

OpenCV中各种类型Mat数据读取

gloomyfish OpenCV学堂 2020-02-04

点击上方↑↑↑“OpenCV学堂”关注我

作者博客: https://blog.csdn.net/Layumi1993

OpenCV中Mat作为图像容器对象,支持各种数据类型像素值的存储与读取,但是初学者经常因此被被搞得很头大,无法正确的读取不同类别的数据。本文就来详细解释一波各个数据类别,以及不同类别之间的数据转换,搞定Mat中的数据类型问题。

Mat的数据类型定义

类型枚举定义

#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

对应的数据类型如下:

八位无符号整型 (uchar) CV_8U
八位有符号整型 (schar) CV_8S
十六位无符号整型 (ushort) CV_16U
十六位有符号整型 (short) CV_16S
三十二位有符号整型 (int) CV_32S
三十二位浮点数 (float) CV_32F
六十四位浮点数 (double) CV_64F

获取各种类型Mat的像素值

Data_type* curr_row = src.ptr<data_type>(row_index)

其中data_type可以为
-uchar
-schar
-ushort
-short
-int
-float
-double


类别转换与获取简单示例:
// 类型转换
Mat dst;
src.convertTo(dst, CV_32F);


// 获取数据
uchar* data = (uchar*)src.data;
float* result = (float*)dst.data;

为什么要数据类型转换

这个是很多人问过我的问题,OpenCV中默认加载图像imread函数的返回是通道顺序为BGR色彩色图像,范围是0~255之间,数据类型是CV_8UC的每个通道占一个字节。但是实际上我们在图像处理过程把像素值看成了数据对待,数据处理与计算过程中就会产生各种浮点数据、正数或者负数,如果我们不对字节数据进行提前转换就会导致精度丢失问题或者数据溢出问题,最终就无法达成图像处理算法想要的结果。最后再说一次,图像是特殊的数据!套用一句很经典的话就是,理论上理论与实践是一致的,实际上理论与实践之间还有有点距离,这个就要靠工程人员经验解决。


往期精选

告诉大家你 在看

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存