Я пытаюсь прочитать файл 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?
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])
Если вам нужен указатель на необработанные данные определенного типа, используйте 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];
}
Посмотри пожалуйста документация.