如何在opencv-python中打开一个大的bin文件(~8GB的图像流)



背景

二进制文件包含来自拜耳模式形式的相机传感器的连续原始输出。即数据是包含如下所示形式的信息的连续块,并且其中每个块是图像流中的图像

[(bayer width) * (bayer height) * sizeof(short)]

目标

从特定的数据块中读取信息,并将其存储为数组以进行处理。我在挖掘opencv文档,完全不知道如何继续。我为新手的问题道歉,但有什么建议吗?

假设您可以读取二进制文件(作为一个整体),我会尝试使用Numpy将其读取为numpy.array。您可以使用numpy.fromstring,根据文件写入的系统(小端或大端),使用>i2<i2作为数据类型(您可以在此处找到数据类型列表)。

还要注意,>表示big-endian和<意思是little-endian(此处详细介绍)

您可以设置偏移并指定长度,以便读取某个块。

import numpy as np
with open('datafile.bin','r') as f:
    dataBytes = f.read()
data = np.fromstring(dataBytes[blockStartIndex:blockEndIndex], dtype='>i2')

如果你不能从整体上阅读文件,我会使用mmap(需要一点C知识)将其分解为多个文件,然后使用上面的方法。

OP在这里,根据@lsxliron的建议,我考虑使用Numpy来实现我的目标,这就是我最终做的

import numpy as np
# Data read length
length = (bayer width) * (bayer height)
# In terms of bytes: short = 2
step = 2 * length
# Open filename
img = open("filename","rb")
# Block we are interested in i
img.seek(i * step) 
# Copy data as Numpy array
Bayer = np.fromfime(img,dtype=np.uint16,count=length)

拜耳现在以numpy数组成功的形式持有拜耳模式值!!

最新更新