如何正确读取.exr文件并保存为.flo格式?问题排查求助
问题:EXR运动向量转FLO格式时出现缩放重复问题

需求说明
- 我有存储在.exr文件中的游戏运动向量(未知像素格式,大概率为float32),已有用于解码速度的函数。
- 需要将其保存为.flo格式,再用flowiz验证保存是否正确。当前结果如附图所示:flow被压缩到图片1/4区域并重复(已确认flow本身正确,问题出在格式转换环节的缩放和重复)。
现有代码
EXR读取代码(基于iio - imageiov3)
def read_exr_np(path): return np.array(iio.imread(str(path),index=0)[..., :3]).transpose((2,0,1))
转换函数代码
def generate_flow_from_exr(exr_path): flow_exr=read_exr_np(exr_path) flow = decode_velocity(flow_exr,[1440,2560]) write_flow(flow,2560,1440,save_path+str(i-1)+".flo") os.system("python -m flowiz "+save_path+str(i-1)+".flo")
FLO写入函数代码
def write_flow(tensor, width, height, filename): f = open(filename, 'wb') magic = np.array([202021.25], dtype=np.float32) w = np.array([width], dtype=np.int32) h = np.array([height], dtype=np.int32) magic.tofile(f) w.tofile(f) h.tofile(f) flow = np.asarray(tensor).astype('float32') flow.tofile(f) f.close()
尝试过的解决方法
我推测问题出在EXR读取环节,尝试用OpenCV读取.exr文件:
im2=cv2.imread(path, cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH).transpose(2,0,1) #也尝试过: im2=cv2.imread(path,-1)
但两种方式都返回损坏数据,最终生成的flow完全随机。已确认目标.flo格式符合Middlebury规范,但无法用对应方法读取.exr文件。
补充:有示例.exr文件可供测试。
内容的提问来源于stack exchange,提问作者szefitoo
相关产品推荐
相关产品推荐

