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;
参数
m – 目标矩阵。如果m在运算前没有合适的尺寸或类型,将被重新分配。rtype – 目标矩阵的类型。因为目标矩阵的通道数与源矩阵一样,所以rtype也可以看做是目标矩阵的位深度。如果rtype为负值,目标矩阵和源矩阵将使用同样的类型。alpha – 尺度变换因子(可选)。beta – 附加到尺度变换后的值上的偏移量(可选)。
示例
在应用分水岭算法分割图像时,标记图像为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(-1255+255=0)。值大于255的像素将赋值为255,这是因为CV32S转换为无符号CV_8U时,应用了饱和度运算。具体应用参看分水岭算法的相关博文。
正常float转8UC1只要
dstmat.convertTo(aa, CV_8U, 255);
就好。
注:Mat保存图片时,只能保存unsigned 8bits类型的格式,其他格式可以显示但不能imwrite
二、IplImage与Mat互转
IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);
Mat newC = cvarrToMat(oldC0);//把IplImage转成Mat
IplImage oldC1 = newC;//把Mat转成IplImage
CvMat oldC2 = newC;//把Mat转成CvMat
这是为了把经典的OpenCV图像导成矩阵,第一句创建一个320×240的图像;第二句话把IplImage转成Mat;第三句话把Mat转成IplImage;第四句把Mat转成CvMat。
三、三通道与单通道互转
参考:
https://blog.csdn.net/weixin_36340947/article/details/78187342
https://blog.csdn.net/iracer/article/details/49204147
opencv——Mat 矩阵数据类型转换convertTo相关推荐
- opencv笔记(三十一)——Mat 矩阵数据类型转换convertTo
一.数据类型转换 1.一般图像文件格式使用的是unsigned 8bits,对应的数据类型有:CV_8UC1.CV_8UC2,CV_8UC3 其中,CV_8UC3表示3通道8位的unsigned ch ...
- OpenCV—矩阵数据类型转换cv::convertTo
OpenCV-矩阵数据类型转换cv::convertTo 函数 [cpp] view plaincopy void convertTo( OutputArray m, int rtype, doubl ...
- Opencv Mat矩阵操作
Opencv Mat矩阵操作 1.生成矩阵: Mat image(240, 320, CV8UC3); 第一个参数是rows,该矩阵的行数:第二个参数是cols,该矩阵的列数:第三个参数是该矩阵元素的 ...
- OpenCV Mat矩阵(图像Mat)初始化及访问方法
一.Mat初始化 1.使用Mat构造函数 //方法一: Mat M( 2, 2, CV_8UC3, Scalar(0,255,0) );//其实是2*6的矩阵,因为每个元素有3个通道. Mat M1( ...
- 解决方案-vector初始化后存放Mat,出现Mat矩阵数据同变问题
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 问题说明 近期在用vector存放Mat数据时发现个很有意思的现象,大概意思是我初始化了一个ve ...
- Python矩阵数据类型转换
a为矩阵,若将a的数据类型转为int,则a.astype(np.int),ps:这样不会改变a自己的数据类型,若想改变,则赋值给a,即a=a.astype(np.int)
- Opencv中 Mat矩阵中属性【随笔记】
Opencv Mat矩阵中data.size.depth.elemSize.step等属性的理解 data: uchar类型的指针,指向Mat数据矩阵的首地址.可以理解为标示一个房屋的门牌号: dim ...
- 图像位深度 8位 16位 24位 32位区别对比 RGB 真彩色 基本概念:(大小,深度,通道)位深度数据类型转换原理 Mat数据读取(opencv里的imread)
位深度 位深度是指在记录数字图像的颜色时,计算机实际上是用每个像素需要的二进制数值位数来表示的.计算机之所以能够显示颜色,是采用了一种称作"位"( bit ) 的记数单位来记录所表 ...
- Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
本文介绍在C++ 语言中,矩阵库Armadillo的mat.vec格式数据与计算机视觉库OpenCV的Mat格式数据相互转换的方法. 在C++ 语言的矩阵库Armadillo与计算机视觉库Op ...
- opencv mat 修改_C++ opencv矩阵和pytorch tensor的互相转换
矩阵和tensor相互转换 cvmat到tensor tips:这里主要要注意的就是在opencv和pytorch中存储顺序的差异 cv::cvtColor(frame, frame, CV_BGR2 ...
最新文章
- javascript eval和JSON之间的联系
- 非常简单的截图小工具
- C#创建一个Windows Service
- 70 Zabbix自定义监控项
- Thread系列之Thread.Join()
- MB_SELECT_GR_BLOCKED_STOCK 读取物料收货冻结库存
- 解决关于 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it....报错
- iOS获取自1970年毫秒数使用OC和swift两种语法,返回字符串
- Java伪代码之大道至简读后感
- Extension Method - c#3.0
- 学习mongo系列(五) AND,$or,$type
- 根据数据库名称glkf查看使用的用户
- 查看sql语句的执行计划
- js中.getMonth() 获取月份比实际月份少一个月
- 一个关于随机矩阵谱范数的不等式
- 广州图书馆——携程评论爬取
- cad打开卡死_在打开cad文件的时候会出现死机的状态
- 外周传出神经的递质有,外周神经系统神经递质
- C语言中的全局变量定义与使用
- RGB与HSV等的转换
热门文章
- 文件格式转换——DMG文件格式转换成ISO文件
- [转载]宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)
- 获取服务器的wsdl文件,vb.net根据wsdl文件生成WebService服务器端代码
- 一片文章教你如何做前端笔记。适合前端人员的笔记软件
- 2021计算机考研复试攻略(2020复试经验总结)
- WinRAR去除打开后弹出广告的方法
- STM32H743 驱动 W25Q256
- 随机生成姓名,姓名生成器
- abaqus6.14 帮助 Abaqus Example Problems Guide翻译
- 企业如何应用ERP?企业应用ERP流程详解。