3
votes

Importer une image d'opencv dans le bucket s3

J'essaie de télécharger une image sur s3 après avoir détecté un visage à l'aide d'opencv. Le fichier jpg est téléchargé sur s3 mais je ne parviens pas à ouvrir l'image.

Je peux télécharger correctement en enregistrant d'abord l'image sur le disque local, puis en la téléchargeant sur s3 mais je veux le faire directement après avoir détecté le visage. Une idée de la façon dont cela peut être fait?

# 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


2 commentaires

Je trouve normalement qu'il est plus facile d'enregistrer une image sur le disque local, puis de télécharger ce fichier sur Amazon S3. De cette façon, vous pouvez tester le contenu de l'image avant de l'envoyer à S3 (bon pour le débogage!). Cela évite également toute l'exigence Body / Bytes.


@JohnRotenstein Vrai, mais j'utilise Raspberry Pi et mon espace est très limité. Mais je pense que j'écrirai dans le script ci-dessus pour supprimer les images dès qu'elles auront terminé leur téléchargement.


3 Réponses :


0
votes

Je crois que l'objet image n'est pas une représentation binaire encodée en JPEG. C'est un objet NumPy à des fins mathématiques

Vous devriez vérifier Python OpenCV convertir l'image en chaîne d'octets? et

imencode

Encode une image dans une mémoire tampon. Pour générer un objet que S3 peut prendre


0 commentaires

0
votes

pip install Pillow

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

Ce code a fonctionné pour moi, mais il donne une petite nuance bleue à l'image téléchargée. J'ai donc décidé de commencer par enregistrer l'image sur le disque local, puis de la télécharger sur S3

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


0 commentaires

1
votes

Remplacez cette ligne:

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

par

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

et cela devrait fonctionner.


0 commentaires