我注意到,使用convertTo将矩阵从32位转换为16位“rounds”数字到上层。因此,源矩阵中大于0x0000FFFF的值将在目标矩阵中设置为0xFFFF。OpenCV 2.4.7 Mat :: convertTo()32位到16位截尾
我想为我的应用程序,而不是屏蔽值,设置在目标只是2 LSB的值。
下面是一个例子:
Mat mat32;
Mat mat16;
mat32 = Mat(2,2,CV_32SC1);
for(int y = 0; y < 2; y++)
for(int x = 0; x < 2; x++)
mat32.at<unsigned int>(cv::Point(x,y)) = 0x0000FFFE + (y*2+x);
mat32.convertTo(mat16, CV_16UC1);
该矩阵具有这些值:
32 bits matrix:
0000FFFE 0000FFFF
00010000 00010001
16 bits matrix:
0000FFFE 0000FFFF
0000FFFF 0000FFFF
在16位矩阵的第二行我想有
00000000 00000001
我可以通过逐个值地扫描源矩阵并掩蔽值来做到这一点,但性能很低。
有没有OpenCV功能可以做到这一点?
感谢大家!
MIX
根你的问题的原因是OpenCV在cv :: Mat :: convertTo()方法中应用了cv :: saturate_cast。这在文档中有明确说明。 – sansuiso