Работа с камерой мобильного телефона в Python

В прошлой статье мы рассмотрели установку Python для S60 и работу в интерактивной консоли, сегодня мы рассмотрим возможности работы Python с камерой мобильного телефона.

Итак, приступим...



Для работы с камерой в Python существует специальный модуль camera. Для начала получим разрешения фото поддерживаемые камерой:
import camera
sizes = camera.image_sizes()

Причем если мы просто напишем в консоли camera.image_sizes то получим весьма странные результаты – что разрешение камеры не больше 2-х мегапикселей. Для того чтобы была возможность получать фото во всю “мощь” камеры необходимо первоначально перевести приложение в пейзажный режим (горизонтальный).
Для этого перед подключением камеры нам необходимо добавить строку appuifw.app.orientation = 'landscape'.
Для того чтобы включить превью камеры необходимо получить канвас нашей формы, для этого: canvas = appuifw.Canvas()
Также предварительно необходимо подготовить небольшую функцию для инициализации превью:
def cam_finder(im):
canvas.blit(im)


Ну и теперь мы смело можем запускать предпросмотрщик:
camera.start_finder(cam_finder, size=(320,240))
здесь указаны размера окна предпросмотра – они могут быть произвольного размера.

Теперь же нам необходимо сделать снимок с камеры, для этого добавим к центральной кнопке возможность делать фото:
canvas.bind(key_codes.EKeySelect, take_picture)
здесь:
EKeySelect – это центральная кнопка джойстика,
take_picture – это функция которая будет выполняться при нажатии кнопки, напишем ее:
для начала необходимо отключить предпросмотр:
camera.stop_finder()
затем самое главное – получить фото с камеры, для этого служит функция camera.take_photo, которая может принимать множество параметров, таких как zoom, использование вспышки, размер фото и другие. Мы задаем лишь размер фото.
pic = camera.take_photo(size = (cur_w,cur_h))

Вот собственно и то чего мы и добавались – получить фото с камеры. В результате мы имеем объект класса Image который поддерживает основные операции, такие как – ресайзинг, сохранение, добавление текста, рисование простых фигур и другие.
Для того чтобы сохранить полученное изображение используется функция save, которая принимает имя файла и степень качества jpeg от 1 до 99
pic.save(filename, quality=75)

Ниже представлена небольшая программа с возможностью выбора разрешения фото и подробными комментариями.
image
Исходный код сюда не смог написать, так как хабр съедает все пробелы в начале строк, а для питона это критично, так что смотрим исходник с комментариями тут
+46
4 марта 2009, 16:45
45
zoc 16,6

комментарии (22)

+1
walker #
выложите лучше исходник на pastebin
программа ваша? если да — может стоит все же здесь привести основной код с коментами?
+2
zoc #
спасибо за совет, выложил свой исходник и поправил пост
0
hoblin #
Ссылка на код нерабочая. Попробуйте выложить на Pastie
+1
p0is0n #
Спасибо *ушел фотографировать*
0
antirek #
круто!
0
CombatPenguin #
Спасибо, добавил в избранное!
0
AlexcYeCu #
Ну что я могу сказать…
А можно сейвить на сервер по ip?
… Ждём статью про запись видео (чтобы отключить этот чёртов диод).
0
Valery35 #
Можно — с ftp+PyS60 мы это делали.
При этом еще на блутузе GPS болталась и камера работала (N80 была)

Пока не могу публиковать.

Респект автору
0
Ockonal #
Во, как раз недавно возился с этим. Как на счет изменения режимов фотографирования? Попробуйте получить фото текста нормального качества, буду очень признателен =)
За статью спасибо
–1
Ockonal #
max_w = 0
max_h = 0

for size in sizes:
if size[0] > max_w:
max_w=size[0]
max_h=size[1]
cur_w=max_w # установка по умолчанию максимального разрешения фото
cur_h=max_h
— Да, как я помню, в массиве все разрешения идут в возростающем порядке. Почему не делать так: sizes[-1], и мы получаем максимальные размеры. Или я не прав?
0
p0is0n #
а max() уже не в моде?:))
–1
Ockonal #
Я пока начинающий программист на питоне. Всех функций пока не знаю. Но спасибо, теперь буду знать.
+1
ApeCoder #
if (cur_w==640): # устанавливаем чтобы текущее разрешение помечалось в меню звездочкой
        text_640x480=u'*'+text_640x480
    if (cur_w==1280):
        text_1280x960=u'*'+text_1280x960
    if (cur_w==1600):
        text_1600x1200=u'*'+text_1600x1200
    if (cur_w==1024):
        text_1024x768=u'*'+text_1024x768
    if (cur_w==2048):
        text_2048x1536=u'*'+text_2048x1536
    if (cur_w==2592):
        text_2592x1944=u'*'+text_2592x1944


ЖУТЬ

=>
0
ApeCoder #
resolutons = [(640, 480), (1280, 1960), (1600, 1200), (1024, 768)]
menu = [('%s%dx%d'%('*' if w==cur_w else '', w, h), setter(w, h)) for w, h in resolutons]

0
ApeCoder #
def setter(w, h)
   def set_resoltion():
        global cur_w
        global cur_h
        cur_w=w
        cur_h=h
        set_resolution_menu()
    return set_resoluton
0
Ockonal #
Спасибо за этот код, но, имхо, у автора сделано лучше, хоть и криво. Его код и я понял, а твой — не везде, ведь я пока только начинаю.
0
ApeCoder #
так понятней:
menu = []
for width, height in resolutions:
     name = '*'  if width == current_width else ''
     name += str(width) + 'x' + str(height)
     menu.append((name, setter(width, height))
0
bormotov #
по ссылке на pastebin мне предлагают вводить код. Я что-то делаю не так?
0
zoc #
прошу прощения, поправил ссылку
0
bormotov #
спасибо :)
0
Mar4ello #
Спасибо за интересный рассказ, а не подскажите какие средства использовали для написания кода, чем компилили, чем собирали в *.sis?
0
MaEcTPo #
Спасибо за познавательные статьи, но ваш код более не доступен на том сайте, а хотелось бы посмотреть. Не выложите ли еще разочек куда-нибудь?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.