我坚持在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
代码有什么问题?有谁知道如何解决这个问题?
答案 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。
另外,也许可以尝试将其写为FileStorage
或PGM
格式而不是PNG
,并在普通编辑器中查看该文件,看它是否真的像16位数据 - 如果它可以工作的话。