opencv中类型转换问题

来源:互联网 发布:java模拟登陆qq空间 编辑:程序博客网 时间:2024/05/21 20:26

记录一下最近困惑我的问题~方便以后查阅
在学习立体匹配算法中BM算法时,出现在了关于类型转换的问题 :disp.convertTo(disp8u, CV_8U, 255 / (numberOfDisparities*16.))
不知道为什么做此转换,经过资料的查阅,终于解惑啦!
在opencv中,如果是float形式,如果用imshow函数显示,只会显示像素值在0.0-1.0之间的,如果像素值大于1.0会显示为白像素,小于0.0显示为黑。为了可视化float形式的图像。可以将它的值归一化到0-1;
同理,如果用convertTo函数(src.convertTo(dst, type, scale, shift)创建指定类型的矩阵,当值超过显示范围时,则将它限制为最大值或者最小值。
所以当目标数据类型为cv_8U时,需要将值图像的像素值约束在0-255之间,所以就靠scale和shift来做缩放,假设矩阵A的最大值为max最小值为min,则

if (Min!=Max){     A -= Min;    A.convertTo(B,CV_8U,255.0/(Max-Min));}

所以本段代码中,disp为视差图,最小视差默认为0,numberOfDisparities为最大视差与最小视差的差值,除以16则是根据邹老师的说法,得到的结果是CV_16S,需要除以16才能得到正确的视差值。