我使用blender生成了一些深度图,并以OpenEXR格式保存了z缓冲区值(32位(。有没有办法使用 OpenCV 2.4.13 和 python 2.7 从 .exr 文件(逐像素深度信息(访问值?任何地方都找不到例子。我在文档中看到的所有内容都支持这种文件格式。但是尝试读取这样的文件会导致错误。
new=cv2.imread("D:\Test1\0001.exr")
cv2.imshow('exr',new)
print new[0,0]
错误:
print new[0,0]
TypeError: 'NoneType' object has no attribute '__getitem__'
和
cv2.imshow('exr',new)
cv2.error: ........opencvmoduleshighguisrcwindow.cpp:261: error: (-215) size.width>0 && size.height>0 in function cv::imshow
我找到的最接近的是这个链接和这个链接。
我可能有点晚了,但是;是的,您绝对可以使用OpenCV。
cv2.imread(PATH_TO_EXR_FILE, cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH)
应该得到你需要的东西
完整解决方案
@Iwohlhart的解决方案为我抛出了一个错误,并按照修复了它,
# first import os and enable the necessary flags to avoid cv2 errors
import os
os.environ["OPENCV_IO_ENABLE_OPENEXR"]="1"
import cv2
# then just type in following
img = cv2.imread(PATH2EXR, cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH)
'''
you might have to disable following flags, if you are reading a semantic map/label then because it will convert it into binary map so check both lines and see what you need
'''
# img = cv2.imread(PATH2EXR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
您可以使用
OpenEXR软件包
pip --no-cache-dir install OpenEXR
如果上述失败,请安装 OpenEXR 开发库,然后按上述方式安装 python 包
sudo apt-get install openexr
sudo apt-get install libopenexr-dev
如果未安装 gcc
sudo apt-get install gcc
sudo apt-get install g++
读取 exr 文件
def read_depth_exr_file(filepath: Path):
exrfile = exr.InputFile(filepath.as_posix())
raw_bytes = exrfile.channel('B', Imath.PixelType(Imath.PixelType.FLOAT))
depth_vector = numpy.frombuffer(raw_bytes, dtype=numpy.float32)
height = exrfile.header()['displayWindow'].max.y + 1 - exrfile.header()['displayWindow'].min.y
width = exrfile.header()['displayWindow'].max.x + 1 - exrfile.header()['displayWindow'].min.x
depth_map = numpy.reshape(depth_vector, (height, width))
return depth_map