Я пытаюсь загрузить изображение глубины в формате OpenEXR с одним каналом, однако я не смог определить формат, который мне нужно использовать, основываясь на этой документации: http://www.openexr.com/documentation/ReadingAndWritingImageFiles.pdf
РЕДАКТИРОВАТЬ: мне удалось прочитать файл, но когда я пытаюсь проверить значения, они округляются до ближайшего целого числа, но я не понимаю, почему это происходит.
Imf::InputFile file (filename.c_str());
Imath::Box2i dw = file.header().dataWindow();
int width = dw.max.x - dw.min.x + 1;
int height = dw.max.y - dw.min.y + 1;
cv::Mat inputImage = cv::Mat::zeros(cv::Size(width,height), CV_32F );
Imf::FrameBuffer frameBuffer;
frameBuffer.insert ("Z", // name
Imf::Slice (Imf::FLOAT, // type
(char *) (inputImage.data), // base pointer
sizeof(CV_32F)*1, // xStride
sizeof(CV_32F) * width, // yStride
1, 1, // x/y sampling
0.0)); // fillValue
file.setFrameBuffer (frameBuffer);
file.readPixels (dw.min.y, dw.max.y);
cout << inputImage.at<float>(285,562) << endl;
EDIT2: файл exr можно получить отсюда: https://drive.google.com/file/d/1q_AmJgzJjs3bOCCpmcC-X-iAH88PY9dG/view?usp=sharing
Я думаю, что вижу две проблемы, оба в одном и том же вызове функции:
Imf::FrameBuffer frameBuffer;
frameBuffer.insert ("Z", // name
Imf::Slice (Imf::FLOAT, // type
(char *) (inputImage.data - dw.min.x - dw.min.y * width), // base pointer
sizeof(CV_32F)*1, // xStride
sizeof(CV_32F) * width, // yStride
1, 1, // x/y sampling
0.0)); // fillValue
Во-первых, размер OpenCV Mat соответствует точной ширине и высоте изображения OpenEXR, что означает, что у вас будут проблемы, если вы поместите его в любое другое место, кроме самого начала буфера Mat. Итак, измените эту строку:
(char *) (inputImage.data - dw.min.x - dw.min.y * width), // base pointer
в
(char *) (inputImage.data), // base pointer
Во-вторых, вы используете sizeof(CV_32F)
, Дело в том, что CV_32F
это не тип, это элемент перечисления типов, поэтому я думаю, что вы должны предпочесть sizeof(float)
так как ваши элементы являются поплавками.
Других решений пока нет …