次の仕事両方:
#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を入力してください。
また、PNG
の代わりにFileStorage
またはPGM
の形式に書き込んでみて、通常のエディタでそのファイルを見て、実際に16ビットデータのように見えるかどうか、そしてまったく動作するかどうかを確認してください。
問題は画像を保存することではありません。問題はimreadを使ってイメージを読み込むときだと思います。もしフラグを指定せずにimreadを使うと、デフォルトのオプションはイメージがカラーイメージであるとみなし、それを8ビットのucharとしてロードしようとします。 'cv :: imread(" DepthInput.png "、CV_LOAD_IMAGE_UNCHANGED); '深度画像をロードする・ – masad