我尝试使用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更大的数据?
答案 0 :(得分: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
。
模板化像素访问函数cv::Mat::at<T>()
img1.at<Vec4w>(y,x) = reinterpret_cast<Vec4w>(Processor.imgdata.image[i])
使用专门的班级Mat4w img(height, width)
,然后使用operator(y,x)
img1(y,x) = reinterpret_cast<Vec4w>(Processor.imgdata.image[i])
答案 1 :(得分:1)
如果需要指向特定类型的原始数据的指针,最好使用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。
答案 2 :(得分:0)
Mat.data看起来像一个uchar,但实际上它包含内存中的所有ushort数据。您可以简单地将内存复制到ushort数组中,如下所示:
memcpy(your_array, img.data, your_array_size);