Как сохранить изображение, прочитанное через camera.capture_continuous (формат rgb), и сохранить его в файл

Я читаю камеру raspi через camera.capture_continuous(stream,format='rgb', use_video_port=True, resize=(width, height), чтобы передать ее на ускоритель usb coral edge. Это отлично работает. Но теперь я хочу сохранить определенные изображения (в зависимости от анализа) на жесткий диск.

Я новичок в Python... file.write не работает. Я предполагаю, потому что я получаю какие-то необработанные данные изображения rgb, а не jpg.

Я хотел бы иметь возможность хранить изображение в формате jpg. Может кто подскажет какую функцию использовать?

Обновлять

Я попробовал следующее

import argparse
import os
import io
import time
from collections import deque
import numpy as np
import picamera
from PIL import Image
import edgetpu.classification.engine

def main():

  stream = io.BytesIO()
  engine = edgetpu.classification.engine.ClassificationEngine(args.model)

  for foo in camera.capture_continuous(stream,
                                       format='rgb',
                                       use_video_port=True,
                                       resize=(width, height)):
      stream.truncate()
      stream.seek(0)
      input = np.frombuffer(stream.getvalue(), dtype=np.uint8)
      results = engine.ClassifyWithInputTensor(input, top_k=3)

      ...

      image = Image.fromarray(input.astype('uint8'), 'RGB')
      image.save("imgs/image_" + str(i) + ".jpg")

Но только получил ошибку:

Traceback (most recent call last):
  File "mio.py", line 85, in <module>
    main()
  File "mio.py", line 75, in main
    image = Image.fromarray(input.astype('uint8'), 'RGB')
  File "/usr/lib/python3/dist-packages/PIL/Image.py", line 2529, in fromarray
    size = shape[1], shape[0]
IndexError: tuple index out of range

Что я делаю не так?


person Michael    schedule 26.08.2019    source источник
comment
Допустим, вы записываете RGB-изображения размером 640x480 пикселей и сохранили одно из них на диск размером 921 600 байт. Вы можете легко преобразовать его позже в JPEG или PNG с помощью ImageMagick, как это convert -depth 8 -size 640x480 RGB:yourfile result.jpg   -  person Mark Setchell    schedule 27.08.2019
comment
что было бы возможно - но я предпочитаю напрямую сохранять его в правильном формате, если это возможно   -  person Michael    schedule 28.08.2019
comment
Убедитесь, что в вашем коде есть все необходимые операторы import и все необходимое, чтобы сделать его минимально полным и поддающимся проверке в соответствии с требованиями StackOverflow.   -  person Mark Setchell    schedule 28.08.2019


Ответы (2)


Вы можете использовать библиотеку Pillow для сохранения изображений на диск. Что-то типа:

pip install Pillow numpy

import numpy as np
from PIL import Image
pixels = np.array([[[255, 0, 0], [0, 255, 0]], [[0, 0, 255], [255, 255, 0]]])
image = Image.fromarray(pixels.astype('uint8'), 'RGB')
image.save('out.jpg')
person Inquisitive    schedule 26.08.2019
comment
for foo in camera.capture_continuous(stream, format='rgb', use_video_port=True, resize=(w,h)): stream.truncate() stream.seek(0) input = np.frombuffer(stream.getvalue(), dtype=np.uint8) results = engine.ClassifyWithInputTensor(input, top_k=3) image = Image.fromarray(input.astype('uint8'), 'RGB') приводит к следующей ошибке: IndexError: индекс кортежа вне допустимого диапазона - person Michael; 27.08.2019
comment
Пожалуйста, добавьте этот код, а также полную трассировку до конца вопроса с заголовком «Обновление». - person Inquisitive; 27.08.2019
comment
Проверьте режим изображения: pillow.readthedocs.io/en/ 3.1.x/руководство/ - person Inquisitive; 29.08.2019
comment
извините.. мне не помогает.. я читаю rgb и пишу создать изображение из rgb.. почему это не должно работать? - person Michael; 30.08.2019
comment
Я рад, что вы нашли решение :) Вы можете опубликовать его здесь как ответ и принять его. Если это поможет кому-то в будущем, они поддержат ваш ответ. - person Inquisitive; 31.08.2019

Решил это следующей строкой

image = Image.frombuffer('RGB', (width,height), streamValue)
person Michael    schedule 02.09.2019