сохранение модуля raspberry python imgproc

#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, но могут быть другие, которые могут дать вам лучшие ответы, если вы откроете новый вопрос!