我尝试使用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大的数据放入数据中?

最佳答案

如果需要指向特定类型的原始数据的指针,则使用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];
}

请参阅documentation

关于c++ - 为什么cv::Mat::data总是指向uchar?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34763098/

10-10 04:49