7

LibRaw を使用して NEF ファイルを読み取り、それを cv::Mat に入れようとしました。NEF ファイルはデータを 12 ビットとして格納します。これは、16 ビットが必要であることを意味するため、次のように CV_16UC4 を使用する必要があります。

Mat img1(height, width, CV_16UC4);

libraw はデータを ushort*[4] として保存するので、これでうまくいくはずだと思いました:

for (i = 0; i < iwidth*height; i++) {       
    img1.data[4*i+1] = Processor.imgdata.image[i][0];
    img1.data[4*i+2] = Processor.imgdata.image[i][1];
    img1.data[4*i+3] = Processor.imgdata.image[i][2];
    img1.data[4*i+4] = Processor.imgdata.image[i][3];
}

また、ushort から uchar への変換が行われるため、データが失われる可能性があるというビルド エラーが発生します。

4

3 に答える 3

1

cv::Mat::dataucharテンプレートクラスになるのを避けるために使用します。他の画像データで埋めるには、データ ポインターをキャストする必要があります。あなたの場合、次のようなことを試してください:

Mat img1(height, width, CV_16UC4);
ushort * data = reinterpret_cast< ushort* >( img1.data );

for (i = 0; i < iwidth*height; i++) {
...
}

img1.dataまたは、ループ内でデータ ポインターを直接変更する代わりに、for使用を検討できます。

  1. テンプレート化されたピクセル アクセス関数cv::Mat::at<T>()

    img1.at<Vec4w>(y,x) = reinterpret_cast<Vec4w>(Processor.imgdata.image[i])
    
  2. 特殊なクラスMat4w img(height, width)を使用してからoperator(y,x)

    img1(y,x) = reinterpret_cast<Vec4w>(Processor.imgdata.image[i])
    
于 2016-01-13T10:30:49.480 に答える
0

Mat.data は uchar のように見えますが、実際にはメモリ内のすべての ushort データが含まれています。次のように、メモリを ushort 配列にコピーするだけです。

memcpy(your_array, img.data, your_array_size);
于 2019-10-02T13:47:49.987 に答える