我尝试使用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/