2016-01-13 40 views
3

我尝试使用LibRaw读取NEF文件,然后将它放在cv :: Mat中。该NEF文件将数据存储为12位,这意味着我需要16位,因此我应该使用CV_16UC4这样的:为什么cv :: Mat :: data总是指向一个uchar?

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更大?

回答

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++) { 
... 
} 

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

  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]) 
    
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

相关问题