Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在16位单通道中写入OpenCV Mat_C++_Opencv - Fatal编程技术网

C++ 在16位单通道中写入OpenCV Mat

C++ 在16位单通道中写入OpenCV Mat,c++,opencv,C++,Opencv,我一直在用16位编写OpenCV Mat。无论我尝试什么,结果总是8位(0-255)图像。我检查了相关的问题,但这里没有解决这个问题 Mat在写入磁盘之前包含0-65535greyscale值。我已经尝试了以下方法(以及更多方法): 正如他们在文档中所说的,在CV_16U 代码有什么问题?有人知道如何解决这个问题吗?以下两项工作: #include <iostream> #include <opencv2/opencv.hpp> using namespace cv;

我一直在用
16位
编写OpenCV Mat。无论我尝试什么,结果总是
8位(0-255)
图像。我检查了相关的问题,但这里没有解决这个问题

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

正如他们在文档中所说的,在
CV_16U


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

以下两项工作:

#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);
}

我认为你的问题在别处。请提供一份报告


此外,也可以尝试将其写入
文件存储
PGM
格式,而不是
PNG
,然后在普通编辑器中查看该文件,看看它是否真的看起来像16位数据,以及它是否工作正常。

谢谢,第一个建议的方法奏效了。我会调查我的代码出了什么问题,然后发布编辑。问题不在于保存图像。我认为问题是当你使用imread加载图像时。如果使用不带任何标志的imread,则默认选项假定图像为彩色图像,并尝试将其作为8位uchar加载,请尝试:
cv::imread(“DepthInput.png”,cv_load_image_UNCHANGED)以加载深度图像·
#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);
}
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%)