Почему cv :: Mat :: data всегда указывает на uchar?

Я пытаюсь прочитать файл NEF с помощью LibRaw, а затем положить его в 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?

3

Решение

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, вы могли бы рассмотреть возможность использования

  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];
}

Посмотри пожалуйста документация.

1

По вопросам рекламы [email protected]