为什么cv :: Mat :: data总是指向uchar?

And*_*rei 5 c++ opencv libraw

我尝试使用LibRaw读取NEF文件,然后将其放在cv :: Mat中。NEF文件将数据存储为12位,这意味着我需要16位,因此我应该像这样使用CV_16UC4:

Mat img1(height, width, CV_16UC4);
Run Code Online (Sandbox Code Playgroud)

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];
}
Run Code Online (Sandbox Code Playgroud)

我还会收到一个构建错误,因为将发生ushort到uchar转换,因此数据可能会丢失,这是有道理的,但是,如何将比uchar大的数据放入数据中?

nil*_*ils 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++) {
...
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 模板化像素访问函数cv::Mat::at<T>()

    img1.at<Vec4w>(y,x) = reinterpret_cast<Vec4w>(Processor.imgdata.image[i])
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用专门的类Mat4w img(height, width),然后operator(y,x)

    img1(y,x) = reinterpret_cast<Vec4w>(Processor.imgdata.image[i])
    
    Run Code Online (Sandbox Code Playgroud)