将图像从 opencv 上传到 s3 存储桶

Posted

技术标签:

【中文标题】将图像从 opencv 上传到 s3 存储桶【英文标题】:Upload image from opencv to s3 bucket 【发布时间】:2019-04-09 01:26:02 【问题描述】:

我在使用 opencv 检测到人脸后尝试将图像上传到 s3。 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

【问题讨论】:

我通常发现最简单的方法是将图片保存到本地磁盘,然后将该文件上传到 Amazon S3。这样,您可以在将图片发送到 S3 之前测试图片的内容(有利于调试!)。它还避免了整个 Body/Bytes 要求。 @JohnRotenstein 是的,但我使用的是 rasberrypi 并且空间非常有限。但我想我会在上面的脚本中编写以在图像上传完成后立即删除它们。 【参考方案1】:

替换这一行:

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

通过

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

它应该可以工作。

【讨论】:

【参考方案2】:

我相信 image 对象不是 JPEG 编码的二进制表示。这是一个用于数学目的的 NumPy 对象

您应该检查Python OpenCV convert image to byte string? 和

imencode

Encodes an image 进入内存缓冲区。生成 S3 可以接受的对象

【讨论】:

【参考方案3】:

点安装枕头

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

【讨论】:

蓝色阴影是由于配色方案从 RGB 更改为 BGR

以上是关于将图像从 opencv 上传到 s3 存储桶的主要内容,如果未能解决你的问题,请参考以下文章

将图像从库上传到s3存储桶 - 创建文件对象?

使用 amazon sdk 和存储桶策略从 ios 应用程序将图像上传到 amazon s3

如何将图像上传到 s3 存储桶

代号一上传图片到S3存储桶权限

python [将图像上传到s3存储桶]

如何在 Android 中使用 REST API 将图像上传到 S3 存储桶,出现禁止错误:403