2012-06-21 79 views
0

我有以下代码转换矩阵的“类型”使用cv :: Mat.convertTo()函数在OpenCV API在OpenCV中转换矩阵的类型

但是,当我使用imshow()显示它时,图像是完全不同的。

转换后的图像是完全灰色的。

但是,这些图像中的值(cv :: Mat)是相同的。

我想我在这里错过了一些非常平凡的东西。

Mat x = imread("/home/jason/Desktop/1.png",0); 
Mat y = Mat(x.rows,x.cols,CV_16S,Scalar(0)); 

x.convertTo(y,CV_16SC1, 1,0); 

imshow("x",x); 
imshow("y",y); 
waitKey(0); 

cout<<x.type()<<endl; 
cout<<y.type()<<endl; 

//verifying the values in the image. 

cout<<"rows 10"<<x.row(10)<<endl; 
cout<<"rows 10"<<y.row(10)<<endl; 

回答

1

你逝去CV_16S图像到(其C当量或)imshow的像素值由公式v 可视化之前隐含地重新计算显示 = 128 + V 图像0​​/256

因此,您可能需要将图像乘以一些常数(256?),或在imshow调用之前将其转换为CV_8U

+0

这很有趣。我只是检查文件。我认为这是非常微不足道的注意。你有什么线索为什么这样做? – garak

+1

有几个原因:1)没有那么多的设备能够显示每个通道8位以上的数据。 2)只有BGR888格式足够便携,才能在OpenCV旨在工作的各种系统上显示。 3)OpenCV中的GUI功能专为算法开发和调试而设计,但不适用于构建真实世界的应用程序。 –