加载 OpenEXR 单通道深度图图像
Loading OpenEXR single channel depth map image
我正在尝试使用一个通道加载 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)
因为你的元素是浮点数。
我正在尝试使用一个通道加载 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)
因为你的元素是浮点数。