2015-06-20 2 views
2

Я получаю некоторые данные кадра из веб-камеры в виде значений rgb.Преобразование многомерного массива в кортеж в python

import numpy as np  
frame = get_video() 
print np.shape(frame) 

Выходной сигнал (480, 640, 3). Теперь я хочу построить изображение из этих значений. Итак, я хочу использовать

im = Image.new("RGB", (480, 640),frame) 

Но здесь третий аргумент занимает кортеж. Я получаю эту ошибку

SystemError: new style getargs format but argument is not a tuple 

Итак, мой вопрос, что это лучший способ, чтобы преобразовать этот фрейм данных в кортеж, так что я могу построить свой имидж.

+0

Что get_video() дают? –

+0

get_video() получает значения RGB видеокадра. Таким образом, в основном кадр содержит значения 480 x 640 RGB. – user3288346

ответ

0

Я нашел эту реализацию, чтобы быть быстрее

from PIL import Image 

im = Image.new("RGB", (480, 640), (0, 0, 0)) #initialize 480:640 black image 
while True: 
frame = get_video() 
im = Image.fromarray(frame) 
im.save('some-name', 'JPEG') 
1

Я предполагаю, что вы импортируете класс Image из PIL.

Документация для Image.new(), доступ к которой осуществляется с помощью команды console Image.new? is:

В [3]: Image.new?
Тип: функция
Базовый класс:
Строка Форма:
Пространство имен: Интерактивная
Файл: /usr/lib/python2.7/dist-packages/PIL/Image.py
Определение: Image.new (режим, размер, цвет = 0)
Docstring: Создайте новое изображение

Третий параметр - цвет RGB, такой как (255,255,255), для заполнения изображения отверстия. Вы не можете инициализировать отдельные пиксели с помощью этой функции.

Я также предполагаю, что кадр представляет собой трехмерный массив. Как показывает ваш вывод, это 480 строк и 640 строк кортежей RGB.

Я не знаю, если есть более простой способ сделать это, но я бы установить значение пикселей с помощью функции putpixel(), что-то вроде:

im = Image.new("RGB", (480, 640), (0, 0, 0)) #initialize 480:640 black image 
for i in range(480): 
    for j in range(640): 
     im.putpixel((i, j), tuple(frame[i][j])) 

Всегда проверяйте строку документации с помощью консоли, это экономит много времени. Я также рекомендую использовать ipython в качестве консоли.

+0

Большое спасибо. Я отвечу на ваш ответ, если вы замените 'im.putpixel ((i, j), frame [i] [j])' на 'im.putpixel ((i, j), tuple (frame [i] [j])) '. Он работает хорошо, но я на самом деле пытаюсь транслировать это видео, и он работает очень медленно. Есть лучший способ сделать это? – user3288346

+0

Готово. Это может быть лучше, я никогда не использовал PIL. –

Смежные вопросы