c++ - 加载 OpenEXR 单 channel 深度图图像

标签 c++ opencv depth openexr

我正在尝试使用一个 channel 加载 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),因为您的元素是 float 。

关于c++ - 加载 OpenEXR 单 channel 深度图图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53324870/

相关文章:

c++ - msgsnd 参数无效

c++ fork()和execl()不要等待,完全分离

C++图形构建问题

python - 覆盆子PI B +上的python 2.7 cvtColor错误215

macos - (阴影贴图)将深度缓冲区渲染到纹理并绘制它以检查它

c++ - 3D几何引擎

python-3.x - 从 S3 读取一个视频文件对象,并通过 Opencv 将其用于进一步处理

javascript - Node.js 和 OpenCV

c++ - OpenNI depth 图像交换深度显示

java - 反射没有正确反射