2016-10-27 17 views
0

OpenCV Matを書き込むのに苦労している16 Bit。私が結果を試してみても、常に8 Bit (0-255)イメージです。私はSOに関するこれまでの質問をチェックしましたが、ここではこの問題を解決しました。OpenCV Matを16Bitで1チャンネル書き込む

マットには、ディスクに書き込む前にグレースケール値が含まれています(0-65535)。私はすでに、次の(そしてより多くのアプローチ)を試みた:CV_16U

にある関数imwrite()でマットを節約することが可能であることを、彼らが言うimwrite()のドキュメントのように

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

を何コードに間違っていますか?誰もこれを解決する方法を知っていますか?

+0

問題は画像を保存することではありません。問題はimreadを使ってイメージを読み込むときだと思います。もしフラグを指定せずにimreadを使うと、デフォルトのオプションはイメージがカラーイメージであるとみなし、それを8ビットのucharとしてロードしようとします。 'cv :: imread(" DepthInput.png "、CV_LOAD_IMAGE_UNCHANGED); '深度画像をロードする・ – masad

答えて

1

次の仕事両方:

#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ビットデータのように見えるかどうか、そしてまったく動作するかどうかを確認してください。

+0

ありがとうございました。私は自分のコードに何が間違っているかを調べ、編集を投稿するために調査します。 –