查看opencv的mat数据类型及相互转换

       opencv中Mat存在各种类型,其中mat有一个type()的函数可以返回该Mat的类型。类型表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数)。U表示无符号整数,S表示有符号整数,F表示浮点数。

具体用法:

Mat m(2,2,CV_8UC1);
int num=m.type();

type()函数的返回值是一个int整数,这个数对应的数据类型如下所示:

假设  int num=mat.type(),num=16,则表示该mat的数据类型为CV_8UC3。

Mat类型转换convertTo()函数

src.convertTo(dst, type, scale, shift)
1 dst:目的矩阵;
2 type:需要的输出矩阵类型,或者更明确的,是输出矩阵的深度,如果是负值(常用-1)则输出矩阵和输入矩阵类型相同;
3 scale:比例因子;
4 shift:将输入数组元素按比例缩放后添加的值;

公式:   dst(i)=src(i)xscale+(shift,shift,...)
如果scale=1,shift=0,则不进行比例缩放。如果输入数组与输出数组的类型相同,则函数可以被用于缩放和平移矩阵或图像;

        注意不是所有格式的Mat型数据都能被保存为图片,目前OpenCV主要只支持单通道和3通道的图像,并且此时要求其深度为8bit和16bit无符号(即CV_16U),所以其他一些数据类型是不支持的,比如说float型等。(注:这个还有待考证。)
        如果Mat类型数据的深度和通道数不满足上面的要求,则需要使用convertTo()函数和cvtColor()函数来进行转换。
        convertTo()函数负责转换数据类型不同的Mat,即可以将类似float型的Mat转换到imwrite()函数能够接受的类型。而cvtColor()函数是负责转换不同通道的Mat,因为该函数的第4个参数就可以设置目的Mat数据的通道数(只是我们一般没有用到它,一般情况下这个函数是用来进行色彩空间转换的)

from:OpenCV convertTo的用法 - 一杯清酒邀明月 - 博客园convertTo的用法 src.convertTo(dst, type, scale, shift) img参数为图像数据来源,其类型为Mat。注意也不是所有格式的Mat型数据都能被使用保存为图片,https://www.cnblogs.com/ybqjymy/p/13809108.html

        在使用convertTo函数是遇到了一个现象,在使用convertTo函数将CV_8UC1类型的图像转化为CV_32F或CV_64F的时候出现图像变成全白或者部分图像有内容剩下的都不对的情况。

        引发这个现象的原因是浮点数类型在颜色空间中的范围是0-1.0之间,但是CV_8UC1中的像素范围是0-255,这样如果直接转化过去的话,很明显大部分的像素都超过1,全是白的,这里需要先对像素进行一定的缩放,保证它是在浮点类型的颜色范围内的。这里用到的是

temp.convertTo(temp, CV_32FC1,1.0/255);

        一般最后两个参数用默认值就够了,但是这里需要对像素进行一定的缩放,所以设置了缩放比例1.0/255,第四个参数是在缩放的基础上会再加一个值,这里不需要所以用默认值0就好,这样图像会被缩放至浮点数的范围,之后使用imshow的时候,这个函数会自动乘以255进行显示。

from:OpenCV总结——convertTo函数与浮点数类型_windxgz的博客-CSDN博客在使用convertTo函数是遇到了一个现象,这里记录一下(本来以为用的很熟的函数一段时间后还会遇到新的问题,还是需要进一步的研究与学习)。在使用convertTo函数将CV_8UC1类型的图像转化为CV_32F或CV_64F的时候出现图像变成全白或者部分图像有内容剩下的都不对的情况。查找相关资料后在这里做一个记录,引发这个现象的原因是浮点数类型在颜色空间中的范围是0-1.0之间,但是CV_8UC1中的像素范围是0-255,这样如果直接转化过去的话,很明显大部分的像素都超过1,全是白的,这里需要先对像素进https://blog.csdn.net/windxgz/article/details/116518707

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值