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 的转换,这是有道理的,但是,如何将大于 uchar 的数据放入数据中?

4

3 回答 3

3

如果您需要指向特定类型的原始数据的指针,cv::Mat::ptr()最好使用:

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

请参阅文档

于 2016-01-13T14:12:40.403 回答
1

cv::Mat::data使用uchar以避免成为模板类。为了用其他图像数据填充它,您需要转换数据指针。在你的情况下尝试这样的事情:

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

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

img1.data或者,您可以考虑使用,而不是直接在for-loop中更改数据指针

  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 回答