#python #image #raspberry-pi #python-imaging-library
#python #изображение #raspberry-pi #python-imaging-library
Вопрос:
Привет, я использую библиотеку python imgproc
, которая позволяет мне получать изображения с веб-камеры на raspberry-pi. Но я не знаю, как сохранить его в .jpg
файл. Я исследовал везде, но нигде не могу найти ответ.Ссылка на библиотеку находится здесь. Я перепробовал все, но у меня нет pi-cam, который является правильным методом. Это мой текущий код:
import socket
import time
from imgproc import *
cam = Camera(320, 240)
host = "example.com"
port = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ri = socket.gethostbyname(host)
s.connect((ri , port))
x = True
while x:
img = cam.grabImage()
Ответ №1:
Это возможно с помощью, например, PIL или другой подобной библиотеки. Однако, если вы хотите, чтобы это было быстро, возникают некоторые проблемы.
Проблема возникает из imgproc
API, который, похоже, не позволяет быстро получить доступ к самим данным изображения. Единственный способ для этого — использовать __getitem__
метод Image
объекта, например img[x,y]
. Это очень похоже numpy
на массивы, но, к сожалению, у них нет ничего общего.
imgproc
это очень тонкая оболочка, построенная на библиотеке C. Это довольно поучительно imgproc.py
, так как оно показывает все доступные привязки.
Скорее всего, вам придется создавать изображение попиксельно, что не очень быстро. Например:
img_array = numpy.array([ [ img[x,y] for x in range(img.width) ] for y in range(img.height) ] , dtype='uint8')
Получив массив изображений, вы можете преобразовать его в файловое изображение и сохранить изображение:
pil_img = Image.fromarray(img_array)
pil_img.save('my_image.jpg')
Для этого вам понадобятся оба numpy
Image
модуля и (PIL). Этот метод не очень быстрый. Альтернативой является создание пустого numpy
массива и его заполнение:
img_array = numpy.empty((img.height, img.width, 3), dtype='uint8')
for y in range(img.height):
for x in range(img.height):
img_array[y,x] = img[x,y]
Только тестирование покажет, какой из них менее медленный.
В принципе, не так уж сложно расширить библиотеку, добавив немного более мощные функции-оболочки вокруг библиотеки, чтобы заставить ее возвращать содержимое двоичного буфера в лучшем формате, но для этого требуются знания как в C, так и в python.
Комментарии:
1. Если вас устраивают изображения в формате PNG, вы можете использовать PyPNG. Это модуль на чистом python, поэтому установка очень проста, вам просто нужно скопировать один модуль туда, где вы хотите его использовать. Конечно, изображения в формате PNG занимают намного больше места.
2. Я предлагаю вам создать новый вопрос, например, «Как сохранить изображение в python 3.4 без использования bumpy или PIL». Я знаю, что это относительно просто сделать в netPBM или BMP, но могут быть другие, которые могут дать вам лучшие ответы, если вы откроете новый вопрос!