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数据的通道数(只是我们一般没有用到它,一般情况下这个函数是用来进行色彩空间转换的)
在使用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进行显示。