2016-05-10 68 views
2

背景如何在opencv python中打開一個大的bin文件(〜8 GB圖像流)?

二進制文件包含從相機傳感器,其是在拜耳(Bayer)圖案的形式連續原始輸出。即,數據是包含以下形式的信息如下所示的連續塊,並且其中每個塊是在圖象數據流

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

目的

要從數據和存儲的一個特定塊中讀取的信息的圖像它作爲一個數組進行處理。我正在挖掘opencv文檔,並完全失去了如何繼續。我爲新手問題表示歉意,但有任何建議?

回答

2

假設您可以讀取二進制文件(整體),我會嘗試使用 Numpy將其讀入numpy.array。您可以使用numpy.fromstring,並根據系統文件寫入(小或大端),使用>i2<i2作爲您的數據類型(您可以找到數據類型的列表here)。

還要注意的是>表示big endian和<意味着小端(更多的here

您可以依次設置的偏移,並指定長度讀取讀取某塊。

import numpy as np 

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

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

如果您無法讀取該文件作爲一個整體,我會用mmap(需要℃的小知識),以便把它分解到多個文件,然後使用上面的方法。

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) 

拜耳現在持有的numpy的陣列成功的形式Bayer模式值!