Как прочитать изображение, используя OpenCV, полученное с S3, используя Python 3? - PullRequest
1 голос
/ 27 апреля 2020

У меня есть куча изображений в папке S3 Bucket.

У меня есть список ключей от S3 (img_list), и я могу читать и отображать изображения:

key = img_list[0]
bucket = s3_resource.Bucket(bucket_name)
img = bucket.Object(key).get().get('Body').read()

У меня есть функция для этого:

def image_from_s3(bucket, key):

    bucket = s3_resource.Bucket(bucket)
    image = bucket.Object(key)
    img_data = image.get().get('Body').read()

    return Image.open(io.BytesIO(img_data))

Теперь я хочу прочитать изображение с помощью OpenCV, но у меня появляется ошибка:

key = img_list[0]
bucket = s3_resource.Bucket(bucket_name)
img = bucket.Object(key).get().get('Body').read()
cv2.imread(img)


SystemError                               Traceback (most recent call last)
<ipython-input-13-9561b5237a85> in <module>
      2 bucket = s3_resource.Bucket(bucket_name)
      3 img = bucket.Object(key).get().get('Body').read()
----> 4 cv2.imread(img)

SystemError: <built-in function imread> returned NULL without setting an error

Посоветуйте, пожалуйста, как читать это правильно?

1 Ответ

1 голос
/ 27 апреля 2020

Извините, я ошибся в комментариях. Этот код устанавливает файл PNG в буфере памяти для имитации того, что вы получаете от S3:

#!/usr/bin/env python3

from PIL import Image, ImageDraw
import cv2

# Create new solid red image and save to disk as PNG
im = Image.new('RGB', (640, 480), (255, 0, 0))
im.save('image.png')

# Slurp entire contents, raw and uninterpreted, from disk to memory
with open('image.png', 'rb') as f:
   raw = f.read()

# "raw" should now be very similar to what you get from your S3 bucket

Теперь все, что мне нужно, это:

nparray = cv2.imdecode(np.asarray(bytearray(raw)), cv2.IMREAD_COLOR)

Итак, вам нужно :

bucket = s3_resource.Bucket(bucket_name)
img = bucket.Object(key).get().get('Body').read()
nparray = cv2.imdecode(np.asarray(bytearray(img)), cv2.IMREAD_COLOR)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...