Загрузить изображение из opencv в корзину s3

Я пытаюсь загрузить изображение на s3 после обнаружения лица с помощью opencv. Файл jpg загружается на s3, но я не могу открыть изображение.

Я могу правильно загрузить изображение, сначала сохранив изображение на локальный диск, а затем загрузив его на s3, но я хочу сделать это напрямую после обнаружения лица. Любая идея, как это можно сделать?

# import the necessary packages

# capture frames from the camera

for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    # grab the raw NumPy array representing the image, then initialize the timestamp
    # and occupied/unoccupied text
    image = frame.array

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv2.CASCADE_SCALE_IMAGE
    )

    # Draw a rectangle around the faces
    for (x, y, w, h) in faces:
        cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # cv2.imwrite('newobama.png', image)

    if len(faces):
        imageName = str(time.strftime("%Y_%m_%d_%H_%M")) + '.jpg'
        #This is not working
        s3.put_object(Bucket="surveillance-cam", Key = imageName, Body = bytes(image), ContentType= 'image/jpeg')   

    # show the frame
    cv2.imshow("Frame", image)
    key = cv2.waitKey(1) & 0xFF

    # clear the stream in preparation for the next frame
    rawCapture.truncate(0)

    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break

person Utkarsh Prakash    schedule 09.04.2019    source источник
comment
Обычно я считаю, что проще всего сохранить изображение на локальный диск, а затем загрузить этот файл на Amazon S3. Таким образом, вы можете протестировать содержимое изображения перед его отправкой на S3 (хорошо для отладки!). Это также позволяет избежать всего требования Body/Bytes.   -  person John Rotenstein    schedule 09.04.2019
comment
@JohnRotenstein Верно, но я использую rasberrypi и у меня очень мало места. Но я думаю, что я напишу в приведенном выше сценарии, чтобы удалить изображения, как только они будут загружены.   -  person Utkarsh Prakash    schedule 09.04.2019


Ответы (3)


Замените эту строку:

    s3.put_object(Bucket="surveillance-cam", Key = imageName, Body = bytes(image), ContentType= 'image/jpeg')   

by

image_string = cv2.imencode('.jpg', image)[1].tostring()
s3.put_object(Bucket="surveillance-cam", Key = imageName, Body=image_string)

и это должно работать.

person Lionel Weicker    schedule 14.06.2019

Я считаю, что объект image не является двоичным представлением в формате JPEG. Это объект NumPy для математических целей.

Вы должны проверить Python OpenCV преобразовать изображение в байтовую строку? и

imencode

Кодирует изображение в буфер памяти. Чтобы сгенерировать объект, который S3 может принять

person qkhanhpro    schedule 09.04.2019

pip установить подушку

from PIL import Image
from io import BytesIO

img = Image.fromarray(image)
out_img = BytesIO()
img.save(out_img, format='png')
out_img.seek(0)
s3.put_object(Bucket="Bucket Name", Key = imageName, Body = local_image, ContentType= 'image/png')  

Этот код работал для меня, но он придает немного синего оттенка загруженному изображению. Поэтому я решил сначала сохранить изображение на локальный диск, а затем загрузить на S3.

cv2.imwrite(imageName, image)
local_image = open('./'+imageName, 'rb')
s3.put_object(Bucket="Bucket Name", Key = imageName, Body = local_image, ContentType= 'image/png')  
person Utkarsh Prakash    schedule 09.04.2019