OpenCV矩阵元素类型

OpenCV矩阵元素类型

深度图上遇到的问题与解决

目前在处理深度图中遇到了一个小问题,因为所提供得到的深度图和RGB图是对应的,所以可以直接读取16位的深度图来生成带有RGB信息的点云.然而按照最简单的方式进行读取之后,所得到的点云是一个片状的情况.

可以发现深度是割裂的,并没有出现连续的深度情况,所以可能是在读取的时候出现了截断.然而在实际检查过程中发现,并不是代码读取部分的问题,而是图片数据源上的问题.所以直接输出depth的一个type来看如下

可以发现,我自己现在获得的depth的一个格式是int 16, 也就是CV8UC3,然而正常的十六位位图应当是CV6UC1, 而后向同学要了一份新的数据之后就可以发现,生成的点云就是连续的,因为这时候获得的深度图的信息就是CV6UC1.

CV::Mat类中的type()函数

这里再补充一下关于OPenCV中的一些数据类型的内容

在使用OPenCV时,一下两个情况是必须知道矩阵元素的数据类型的:

  1. 使用 at 的方式访问数据元素的时候需要指出数据类型
  2. 做数值运算的时候,比如究竟是整数除法还是浮点数除法。

所以需要使用CV::Mat中的type()函数来确定此时的Mat中的数据类型是什么.

因为返回值是int,所以返回值和实际类型有以下的对应关系:

C1C2C3C4
CV_8U081624
CV_8S191725
CV_16U2101826
CV_16S3111927
CV_32S4122028
CV_32F5132129
CV_64F6142230

第四个通道也就是C4表示透明度

可以通过以下的方式来对不同通道进行访问

C1C2C3C4C6
ucharucharcv::Vec2bcv::Vec3bcv::Vec4b
shortshortcv::Vec2scv::Vec3scv::Vec4s
intintcv::Vec2icv::Vec3icv::Vec4i
floatfloatcv::Vec2fcv::Vec3fcv::Vec4fcv::Vec6f
doubledoublecv::Vec2dcv::Vec3dcv::Vec4dcv::Vec6d
数据类型及其取值范围
数值具体类型取值范围
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)