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

时间:2016-05-10 01:00:32

标签: python opencv

背景

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

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

目标

从特定数据块读取信息并将其存储为阵列进行处理。我正在挖掘opencv文档,并完全迷失了如何继续。我为新手问题道歉,但有任何建议吗?

2 个答案:

答案 0 :(得分:2)

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

另请注意&gt;意味着大端和&lt;意味着小端(更多关于here

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

import numpy as np

with open('datafile.bin','r') as f:
    dataBytes = f.read()

data = np.fromstring(dataBytes[blockStartIndex:blockEndIndex], dtype='>i2')

如果您无法整体阅读该文件,我会使用mmap(需要一点C知识),以便将其分解为多个文件,然后使用上述方法。

答案 1 :(得分:0)

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)

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