2014-01-25 37 views
2

像我能夠從一個zip成功加載圖像:使用Python OpenCV中加載從ZIP

with zipfile.ZipFile('test.zip', 'r') as zfile: 
    data = zfile.read('test.jpg') 
    # how to open this using imread or imdecode? 

的問題是:我怎麼能在OpenCV中打開此使用imread或imdecode作進一步處理,不保存第一個圖像?

更新:

這裏預期的錯誤,我得到的。我需要將'數據'轉換爲opencv可以使用的類型。

data = zfile.read('test.jpg') 
buf = StringIO.StringIO(data) 
im = cv2.imdecode(buf, cv2.IMREAD_GRAYSCALE) 
# results in error: TypeError: buf is not a numpy array, neither a scalar 

a = np.asarray(buf) 
cv2.imdecode(a, cv2.IMREAD_GRAYSCALE) 
# results in error: TypeError: buf data type = 17 is not supported 

回答

9

使用numpy.frombuffer()創建一個從字符串數組UINT8:

import zipfile 
import cv2 
import numpy as np 

with zipfile.ZipFile('test.zip', 'r') as zfile: 
    data = zfile.read('test.jpg') 

img = cv2.imdecode(np.frombuffer(data, np.uint8), 1)  
+0

啊,是的,從緩衝區 - 現在開始工作,謝謝! – IUnknown

-1

HYRY's answer確實提供了最完美的解決方案


在Python讀物的圖像並不完全符合"There should be one-- and preferably only one --obvious way to do it."

這是可能的,有時你寧願避免使用numpy應用程序的某些部分。改爲使用Pillowimread。如果有一天你在這樣的情況下發現自己,然後希望下面的代碼片段會出現一些使用:

import zipfile 

with zipfile.ZipFile('test.zip', 'r') as zfile: 
    data = zfile.read('test.jpg') 

# Pillow 
from PIL import Image 
from StringIO import StringIO 
import numpy as np 
filelike_buffer = StringIO(data) 
pil_image = Image.open(filelike_buffer) 
np_im_array_from_pil = np.asarray(pil_image) 
print type(np_im_array_from_pil), np_im_array_from_pil.shape 
# <type 'numpy.ndarray'> (348, 500, 3) 

# imread 
from imread import imread_from_blob 
np_im_array = imread_from_blob(data, "jpg") 
print type(np_im_array), np_im_array.shape 
# <type 'numpy.ndarray'> (348, 500, 3) 

答到"How to read raw png from an array in python opencv?"提供類似的解決方案。

+0

哦,化整爲零,即會盡力使事情的Unicode字符串,這實際上是一個字節數組 – berak

+0

@berak你可能要檢查出來回答[「UnicodeDecodeError:'ascii'編解碼器無法解碼]](http://stackoverflow.com/a/6541289/2419207) – iljau

+0

再次,看看HYRY的答案,這是正確的,恕我直言。 – berak