Литвек - электронная библиотека >> Дмитрий Витальевич Елисеев >> Программирование: прочее и др. >> Цифровая электроника для начинающих >> страница 29
использование такого сервера, рекомендуется создать RAM-диск в памяти и указать путь к нему в настройках fswebcam и index.html. Настройку RAM-диска желающие могут найти в онлайн-руководствах по Raspberry Pi.


4.13. Интервальная съемка (time-lapse photo)
С помощью fswebcam несложно делать серию фото, например каждые 5 секунд. Это позволяет делать интересные кадры, например для записи движения Луны или облаков.


Команда для запуска выглядит так:

fswebcam -l 10 -r 1280x720 test-%Y-%m-%d--%H-%M-%S.jpg


Здесь “-l 10” задает временной интервал, “-r 1280x720” задает разрешение, имя файла “test-%Y-%m-%d--%H-%M-%S.jpg” задает шаблон даты и времени.


Можно указывать разные форматы шаблонов даты-времени, воспользовавшись таблицей:


%d

День месяца [01..31]


%H

Час [00..23]


%I

Час в 12-часовом формате [00..12]


%j

День [001..366]


%m

Месяц [01..12]


%M

Минута [00..59]


%S

Секунда [00..59]


%W

Номер недели в году [00..53]


%w

День [0(Вс)..6]


%y

Год, 2х значное число [00..99]


%Y

Год, 4х значное число


Соответственно, при запуске вышеприведенной команды в текущей папке будут создаваться файлы вида test-2018-02-25--12-39-40.jpg, test-2018-02-25--12-40-50.jpg, test-2018-02-25--12-40-00.jpg и т.д. Потом их можно склеить в видео с помощью специальных утилит.



4.14. Подключаемся к камере с помощью OpenCV
Выше мы использовали fswebcam для записи изображений с камеры. Это хорошо работает, но если мы хотим большей гибкости настроек, то лучше написать собственный код. К тому же, как было сказано выше, постоянная запись файлов уменьшает ресурс карты памяти. Поэтому далее мы будем работать с камерой напрямую.


Для работы с изображениями есть полезная библиотека OpenCV. Для ее установки введем команду: sudo apt-get install python-opencv.


Теперь всего лишь в несколько строк кода, мы можем написать свой аналог fswebcam:


import cv2

import time


cam = cv2.VideoCapture(0) #set the port of the camera as before

try:

count = 0

while True:

retval, image = cam.read() #return a True bolean and and the image if all go right

print count

cv2.imwrite("frame-%d.jpg" % count, image)

count += 1

time.sleep(0.5)

except:

pass


cam.release()


Как можно видеть, мы создаем объект cam = VideoCapture и с помощью функции cam.read читаем изображение. Оно уже хранится в памяти, нам не нужен промежуточный файл, и это большой плюс. В частности, его можно сохранить в папке, вызовом функции cv2.imwrite. Мы также можем сохранять не все изображения, а лишь в случае срабатывания внешнего триггера, например кнопки или реле.


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


Самостоятельная работа: сделать селфи-камеру на Raspberry Pi. Для этого добавить в вышеприведенный код чтения состояния кнопки, и писать изображение в файл только в том случае, если кнопка нажата.


4.15. Запускаем сервер видеотрансляции
Мы уже транслировали фото с вебкамеры через веб-сервер. Осталось сделать следующий шаг, и транслировать полноценное видео. Тем более, что для этого никаких программ писать не потребуется, достаточно лишь установить необходимые компоненты.

Введем команду: sudo apt-get install motion.


Откроем файл настроек, введем команду sudo nano /etc/motion/motion.conf.

Зададим следующие параметры:

daemon off

width 640

height 480

framerate 15

output_pictures off

ffmpeg_output_movies off

stream_port 8081

stream_quality 100

stream_localhost off

webcontrol_localhost off


Кстати, параметры output_pictures и ffmpeg_output_movies отвечают за сохранение изображений и видеороликов - программу motion также можно использовать как детектор движения. Файлы при этом будут складываться в папку /var/lib/motion. Нам эта функция не нужна, так что устанавливаем параметр output_pictures в off.


Наконец, введем команду sudo motion. Сервер работает - можно зайти в браузере на адрес http://192.168.0.104:8081 и увидеть изображение с камеры (из соображений приватности картинка не показана).

Цифровая электроника для начинающих. Иллюстрация № 162

4.16 Отправляем данные через Dropbox
Мы уже рассматривали отправку данных из ESP32 в Dropbox в главе 3.13. Разумеется, то же самое можно сделать и на Raspberry Pi. Рассмотрим отправку обычного файла и текстовых данных в виде строки. Предварительно поставим библиотеки для Dropbox командой sudo apt-get install dropbox. Затем необходимо подключить приложение к Dropbox и получить ключ, как описано в главе 3.13.


Сам код весьма прост. В отличие от ESP32, здесь нам не нужно писать самостоятельно запросы к серверу, все уже реализовано в библиотеке.


import dropbox

import os


token = "V3z9NpYlRxEAAAAAAACHVdBdhVRCnXXXXXXXX"

dbx = dropbox.Dropbox(token)


# 1. Upload file "iter.txt" from the current folder

fullname = "data1.txt"

with open(fullname, 'rb') as f:

data = f.read()

try:

dbx.files_upload(data, "/" + fullname, dropbox.files.WriteMode.overwrite, mute=True)

except dropbox.exceptions.ApiError as err:

print 'Dropbox API error', err


# 2. Upload string as a file

try:

dbx.files_upload("1234567".encode(), "/data2.txt", dropbox.files.WriteMode.overwrite)

except dropbox.exceptions.ApiError as err:

print 'Dropbox API error', err


Отметим здесь 2 полезных параметра. WriteMode.overwrite указывает, что файл будет перезаписан, в противном случае мы получим ошибку, если файл был уже создан. Опциональный параметр mute=True указывает, что файл надо добавить “молча”, без уведомления пользователя (в противном случае на синхронизированном с Dropbox компьютере появляется всплывающее окно). Это бывает полезно, если файлы обновляются постоянно, например, картинка с камеры, которая сохраняется каждые 5 минут.


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


А сейчас мы перейдем к изучению платы для самых маленьких - микрокомпьютера BBC:Micro.