阅读米德尔伯里';流量';使用python的文件(字节数组和numpy)

阅读米德尔伯里';流量';使用python的文件(字节数组和numpy),python,c++,image,numpy,file-format,Python,C++,Image,Numpy,File Format,我正在尝试将.flo文件作为numpy 2通道图像读取 格式描述如下: 用于光流评估的“.flo”文件格式 存储水平(u)和垂直(v)流量分量的2波段浮点图像。 浮点数以小端点顺序存储。 如果| u |或| v |大于1e9,则流量值被视为“未知”。 字节内容 0-3标记:ASCII中的“PIEH”,在little endian中正好是浮点202021.25 (只是检查浮动是否正确表示) 4-7宽度为整数 8-11作为整数的高度 12端数据(宽度*高度*2*4字节总计) u和v的浮点值按行顺序交

我正在尝试将.flo文件作为numpy 2通道图像读取

格式描述如下:

用于光流评估的“.flo”文件格式 存储水平(u)和垂直(v)流量分量的2波段浮点图像。 浮点数以小端点顺序存储。 如果| u |或| v |大于1e9,则流量值被视为“未知”。 字节内容 0-3标记:ASCII中的“PIEH”,在little endian中正好是浮点202021.25 (只是检查浮动是否正确表示) 4-7宽度为整数 8-11作为整数的高度 12端数据(宽度*高度*2*4字节总计) u和v的浮点值按行顺序交错排列,即。, u[row0,col0],v[row0,col0],u[row0,col1],v[row0,col1]。。。 (摘自此)

这是我的代码,但我有点卡住了,我不知道如何将文件读取为2通道numpy 2D数组

将numpy导入为np
导入操作系统
#test.flo,512*512光流文件
f=打开('test.flo','rb')
f、 seek(11,os.seek_SET)#跳过头字节
data_array=np.fromfile(f,np.float16)
data_2D=np.调整大小(data_数组,(512,512))

也许有人知道怎么做?

试试这个。到目前为止,我已经在一个.flo文件上测试了它

import numpy as np
import sys

if __name__ == '__main__':
    if len(sys.argv) <= 1:
        print('Specify a .flo file on the command line.')
    else:
        with open(sys.argv[1], 'rb') as f:
            magic, = np.fromfile(f, np.float32, count=1)
            if 202021.25 != magic:
                print('Magic number incorrect. Invalid .flo file')
            else:
                w, h = np.fromfile(f, np.int32, count=2)
                print(f'Reading {w} x {h} flo file')
                data = np.fromfile(f, np.float32, count=2*w*h)
                # Reshape data into 3D array (columns, rows, bands)
                data2D = np.resize(data, (w, h, 2))
                print(data2D)
将numpy导入为np
导入系统
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':

如果len(sys.argv)bsa的答案不适用于Python3.5以后的版本。下面显示的小修改,例如np.fromfile(f,np.int32,count=1)[0],将被删除

import numpy as np
import os
import sys

# WARNING: this will work on little-endian architectures (eg Intel x86) only!
if '__main__' == __name__:
    if len(sys.argv) > 1:
        with open(sys.argv[1], 'rb') as f:
            magic = np.fromfile(f, np.float32, count=1)
            if 202021.25 != magic:
                print('Magic number incorrect. Invalid .flo file')
            else:
                w = np.fromfile(f, np.int32, count=1)[0]
                h = np.fromfile(f, np.int32, count=1)[0]
                print('Reading %d x %d flo file' % (w, h))
                data = np.fromfile(f, np.float32, count=2*w*h)
                # Reshape data into 3D array (columns, rows, bands)
                data2D = np.resize(data, (h, w, 2))
    else:
        print('Specify a .flo file on the command line.')

这个格式在你所链接的自述文件中被描述,并且C++的代码用于读取<代码>。FLO 文件是-见<代码> Read FraseFor()/Cuth>函数(第46行)以获取详细信息。翻译对于那些有点C++ C++知识的人来说是不太困难的(不幸的是我不是……),如果你下载,你可以在Matlab找到“代码> > RealFrasFr.M./Cube”,如果你更流利的话,谢谢你的评论,我不是那么精通C++或MathLabor,但是我会尝试。事实上,我正在尝试找到一个避免循环的C++风格的NUMPY解决方案,这在Python中会很慢。有两件事跳出来:1)你在指定NP.FLAAT16。从自述文件和C源代码中,有两个4字节(32位)浮点带。试试np.32。2) 您正在查看偏移量11。。数据的开头不应该是偏移量12吗?谢谢!它工作得很好。我以一个有效的解决方案结束,但它相当肮脏;指定w&h,读取整个文件并删除标题。。。你的方法真聪明。再次感谢:在代码< >代码>(w,h,2)< <代码> >代码>(h,w 2)< /Cord>中,翻转<代码> > > > > >代码> >如果你想用MatMattLIB查看它,你能给这个C++代码吗?我想比较两个fol文件(光流Sintel数据集)并得到算法的评估。我想得到“EPE所有EPE匹配EPE不匹配d0-10 d10-60 d60-140 s0-10 s10-40 s40+”来自“”数据集的光流结果。我用了OpenCV 3,VC++2013,赢了7个64位。我需要得到这个结果的示例代码。发布一个新问题并链接回这个问题怎么样。把你目前掌握的代码贴出来。我有点搞不清楚这里是否出了什么问题,因为你读的宽度和高度都是相同的
w=np.fromfile(f,np.int32,count=1);h=np.fromfile(f,np.int32,count=1)
我认为您的代码在Python3.5中不起作用,因为您仍然在使用Python2样式的
print'blah'
而不是
print('blah')
。我已经更新了我的代码,使其能够在Python3.6或更高版本中工作。