Search code examples
python-3.xamazon-web-servicesopencvamazon-s3boto3

How to read image using OpenCV got from S3 using Python 3?


I have a bunch of images in my S3 bucket folder.

I have a list of keys from S3 (img_list) and I can read and display the images:

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

I have a function for that:

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))

Now what I want is to read the image using OpenCV but I am getting an error:

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

Please advise how to read it in the right way?


Solution

  • Sorry, I got it wrong in the comments. This code sets up a PNG file in a memory buffer to simulate what you get from 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
    

    Now, all I need is this:

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

    So, you should need:

    bucket = s3_resource.Bucket(bucket_name)
    img = bucket.Object(key).get().get('Body').read()
    nparray = cv2.imdecode(np.asarray(bytearray(img)), cv2.IMREAD_COLOR)