c++和opencv小知识:openCV中convertTo的用法

openCV中convertTo的用法

convertTo函数一般用于CV_32s转为CV_8U:
原函数解析:
src.convertTo(dst, type, scale, shift)
缩放并转换到另外一种数据类型:
dst:目的矩阵;
type:需要的输出矩阵类型,或者更明确的,是输出矩阵的深度,如果是负值(常用-1)则输出矩阵和输入矩阵类型相同;
scale:比例因子;
shift:将输入数组元素按比例缩放后添加的值;

dst(i)=src(i)xscale+(shift,shift,…)

如果scale=1,shift=0,则不进行比例缩放。

场景应用一:
在应用分水岭算法分割图像时,标记图像为32位有符号整型CV_32S变量构成的矩阵markers(其中像素值有-1,1,2,3……),由于imshow()函数无法显示,想要将标记图像显示出来必须转换其数据类型。
1、CV_32s转为CV_8U

watershed(src, label_img);
	//显示图像
	double maxVal = 0;
	double minVal = 0;
	minMaxLoc(label_img, &minVal, &maxVal);
	Mat dst = Mat::zeros(src.size(), CV_8U);
	label_img.convertTo(dst, CV_8U, 255.0 / (maxVal - minVal), 0);
	imshow("marks", dst);

第三个参数:
如果label_img中的数是(3,2,2,-1)
则对应的((3*(255/4)),(2*(255/4)),(1*(255/4)),-1*(255/4)),
在取整为:(191,127,63,0)
在CV_8U中大于255的为255,小于0的为0
其中第4个参数,可以根据视觉效果添加.

2、CV_8U转为CV_32

dst.convertTo(label_img, CV_32s, 1.0/255, -1);

如果按照上面dst(191,127,63,0);则label_img(3.25,1.99,1.2,-1)

3、也可通过normalize和converScaleAbs结合

normalize(label_img,dst,0,255,NORM_MINMAX,CV_32FC1,Mat())
converScaleAbs(dst,dst);
  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值