opencv笔记(三十一)——Mat 矩阵数据类型转换convertTo

一、数据类型转换

1.一般图像文件格式使用的是unsigned 8bits,对应的数据类型有:CV_8UC1、CV_8UC2,CV_8UC3

其中,CV_8UC3表示3通道8位的unsigned char型

float是32位,对应的CvMat数据结构类型是:CV_32FC1,CV_32FC2,CV_32FC3

double是64位,对应的CvMat数据结构类型是:CV_64FC1,CV_64FC2,CV_64FC3,

其中,CV_64FC3表示64位的3通道double型

如果想实现不同数据类型之间的转化,需要使用convertTo函数

2.需要注意的地方:公式里用到了exp函数,图片默认是unsigned char型,范围是0-255,公式中的0.5是0-1范围内的,所以需要将原图像转换为double型,将灰度值都转换为0-1之间,就可以利用该公式进行相应的运算。处理完以后,图像还是CV_64FC3类型,如果直接保存,点开图像会发现,显示全黑,这是因为电脑默认打开图片是CV_8UC3类型的,所以还需要将CV_64FC3乘以255,再转换为CV_8UC3

3.Vec3b---表示每一个Vec3b对象中,可以存储3个char(字符型)数据,比如可以用这样的对象,去存储RGB图像中的一个像素点  
Vec3d---表示每一个Vec3d对象中,可以存储3个double(字符型)数据
Vec3f---表示每一个Vec3d对象中,可以存储3个float(字符型)数据

函数

void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;

参数

示例

在应用分水岭算法分割图像时,标记图像为32位有符号整型CV_32S变量(以便定义超过255个标签,每个值标记一类物体,如255标记目标,128标记背景,0标记未知等等)构成的矩阵markers,想要将标记图像显示出来必须转换其数据类型。

markers.convertTo(tmp,CV_8U,255,255);

 

将矩阵markers转换为CV_8U类型的矩阵tmp:tmp(x,y)= markers(x,y)*255+255.这样,将图像做线性变换,使值为-1的像素变为0(-1*255+255=0)。值大于255的像素将赋值为255,这是因为CV32S转换为无符号CV_8U时,应用了饱和度运算。具体应用参看分水岭算法的相关博文。

正常float转8UC1只要

dstmat.convertTo(aa, CV_8U, 255);

就好。

注:Mat保存图片时,只能保存unsigned 8bits类型的格式,其他格式可以显示但不能imwrite

二、IplImage与Mat互转

这是为了把经典的OpenCV图像导成矩阵,第一句创建一个320×240的图像;第二句话把IplImage转成Mat;第三句话把Mat转成IplImage;第四句把Mat转成CvMat。

三、三通道与单通道互转

参考:

Mat数据类型 convertTo_c++ mat 转float*_soldier123333的博客-CSDN博客

OpenCV—矩阵数据类型转换cv::convertTo_cv.convertto_iracer的博客-CSDN博客

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值