用16Bit一个频道编写OpenCV Mat

时间:2016-10-27 17:15:43

标签: c++ opencv

我坚持在16 Bit写一个OpenCV Mat。无论我尝试什么,结果始终是8 Bit (0-255)图像。我检查了有关SO的相关问题,但是这里没有解决这个问题。

Mat在将其写入磁盘之前包含0-65535灰度值。我已经尝试了以下(以及更多方法):

cv::Mat depth;
depth.convertTo(depth, CV_16UC1);
imwrite("depth.png", depth);

在他们所说的imwrite()的文档中,当它在CV_16U

时可以用imwrite()保存它

代码有什么问题?有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

以下工作:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;

int main( int, char** argv )
{
  // Start with unsigned shorts and write to PNG
  unsigned short data[4] = {0,12000,24000,65535};
  Mat src =  Mat(1,4,CV_16UC1,data);
  imwrite("depth.png",src);

  // Start with floats and convert to 16-bit then write to PNG
  float dataf[4]={0.0,12000.0,25000.0,65000.0};
  Mat a = Mat(1,4,CV_32FC1,dataf);
  a.convertTo(a,CV_16UC1);
  imwrite("d2.png",a);
}

我可以使用 ImageMagick 检查它们,如下所示,两者都是16位灰度PNG:

convert depth.png txt:

# ImageMagick pixel enumeration: 4,1,65535,gray
0,0: (0)  #000000000000  gray(0)
1,0: (12000)  #2EE02EE02EE0  gray(18.3108%)
2,0: (24000)  #5DC05DC05DC0  gray(36.6217%)
3,0: (65535)  #FFFFFFFFFFFF  gray(255)

convert d2.png txt:

# ImageMagick pixel enumeration: 4,1,65535,gray
0,0: (0)  #000000000000  gray(0)
1,0: (12000)  #2EE02EE02EE0  gray(18.3108%)
2,0: (25000)  #61A861A861A8  gray(38.1476%)
3,0: (65000)  #FDE8FDE8FDE8  gray(99.1836%)

我建议你的问题在别的地方。请提供MCVE

另外,也许可以尝试将其写为FileStoragePGM格式而不是PNG,并在普通编辑器中查看该文件,看它是否真的像16位数据 - 如果它可以工作的话。