Raspberry Pi 3: Камера ( #1) — первое включение, видео, фото, timelapse, отправка фото по e-mail
Существует всего 2 вида камер, предлагаемых официальным сообществом Raspberry — обычная камера и камера ночного видения ( инфракрасная камера для съемки в условиях слабого освещения):
Камера для Raspberry Pi 3 (оригинал, 8 МП, 1080P/720P, v2.1) Камера инфракрасная Pi NoIR для Raspberry Pi 3 (оригинал, 8 МП, 1080P/720P, v2.1)Это второе поколение модулей с камерами для Raspberry Pi. От первого поколения они отличаются новой 8-мегапиксельной матрицей Sony IMX219 с разрешением 3280×2464 пикселей ( подобные матрицы устанавливаются в некоторые мобильные телефоны), вместо 5-мегапиксельной OmniVision OV5647 с разрешением 2592×1944 пикселей. Замена матрицы не принесла увеличения производительности. Режимы записи видео остались прежними: 1080p30, 720p60 и 640×480p60/90. Тем не менее, был сделал серьезный скачок в качестве изображения.
В данной статье будет использован китайский клон первой версии оригинальной камеры, так как он в 4 раза дешевле оригинала:
Камера для Raspberry Pi 3 (клон, 5 МП, 1080P/720P, v1.3) Камера инфракрасная для Raspberry Pi 3 (клон, 5 МП) Камера инфракрасная для Raspberry Pi 3 (клон, 5 МП) с ИК-подсветкой Камера инфракрасная широкоугольная "рыбий глаз" для Raspberry Pi 3 (клон, обзор 150°, 5 МП) Камера широкоугольная "рыбий глаз" для Raspberry Pi 3 (клон, обзор 175/220°, 5 МП) Шлейф FFC гибкий 15-пиновый 1 м (CSI)Все описанное в данной статье также справедливо и для оригинальных камер.
Подключение и настройка
Камера общается с Малинкой по интерфейсу CSI, и подключается к специальному разъему на плате:
Подключив камеру к Малинке, в настройках Raspberry OS ( Preferences → Raspberry Pi Configuration ) необходимо включить возможность использования камеры — вкладка Interfaces пункт Camera кликнуть на Enabled .
Кронштейн монтажный пластиковый для модуля камеры Raspberry Pi 3После перезагрузки, камера готова к использованию.
В случае возникновения проблем с эксплуатацией камеры, в первую очередь, необходимо методом простой прозвонки, удостовериться в наличии контакта между Малинкой и камерой.
Также нужно убедиться, что разъем, соединяющий камеру с платой, тоже надежно зафиксирован.
- raspivid — утилита для захвата видео,
- raspistill — утилита для захвата фотографий,
- raspiyuv — утилита, аналогичная raspistill , только вместо jpg -файлов, в результате генерирует raw -файлы ( несжатые, необработанные).
Также эти утилиты позволяют осуществлять Timelapse-съемку — это такой вид съемки, при котором создается набор фотографий сделанных с заданным интервалом, который потом сшивается в одно видео, создавая эффект ускорения.
Все утилиты должны запускаться с параметрами.
Подробно о параметрах стандартных утилит по работе с камерой можно почитать на официальном ресурсе Raspberry Py Camera Module.
Полный список параметров для каждой утилиты можно получить, если выполнить утилиту без параметров
- настройки окна просмотра, например:
- --preview , -p — параметры окна просмотра <'x,y,w,h'>
- --opacity , -op — установка прозрачности окна просмотра 0. 255 ( 0 — абсолютно прозрачно, 255 — непрозрачно)
- --contrast , -co — контрастность ( -100. 100)
- --brightness , -br — яркость ( 0. 100)
- --exposure , -ex — режим экспозиции
- --annotate , -a — добавление к изображению текстовых данных, например дата, время, настройки или произвольный текст
Остальные параметры специфичны для каждой утилиты.
Необязательный параметр -t устанавливает время работы утилиты в миллисекундах. В случае работы утилиты raspistill ( raspiyuv ), фотография будет сделана по завершении этого времени. Для утилиты raspivid этот параметр задает длительность съемки видео.
Если параметр -t опущен, по умолчанию, используется время работы в 5 секунд.
После — сохранить файл config.txt и перезагрузить Малинку
Примеры использования стандартных утилит
Далее приведены примеры использования утилит:
Для воспроизведения видео можно воспользоваться предустановленным плеером OMXPlayer. Если по каким-то причинам его нет, установить его можно командой:
OMXPlayer — плеер командной строки, без визуального интерфейса. Чтобы запустить ролик, нужно вызвать плеер с указанием, в качестве параметра, имени воспроизводимого файла:
Поскольку файлы с разрешением .h264 , записанные утилитой raspivid , по сути являются сжатым видеопотоком без медиаконтейнера, то при попытке воспроизвести их, при помощи OMXPlayer, они будут воспроизводиться с увеличенной скоростью, вне зависимости от заданной при записи частоты кадров. Для того, чтобы сделать записанные файлы нормально воспроизводимыми, их нужно поместить в любой медиаконтейнер — mkv , avi , mp4 и т.д. Делается это при помощи утилиты avconv — параметром -r задается частота кадров нового видео:
- -o — имя файла, должно содержать маску %04d , для того, чтобы утилита автоматически нумеровала файлы в соответствии с номером кадра. 04 в маске означает количество цифр в номере — 0000, 0001, 0002 и т.д. Маска %08d подставит восьмизначный номер — 00000000, 00000001, 00000002, . Например, -o image%03d.jpg будет генерировать имена файлов image000.jpg , image001.jpg , image002.jpg и т.д.
- -t — длительность работы камеры, в миллисекундах.
- -tl — интервал между кадрами, в миллисекундах. Если параметр -tl устанавливается равным нулю, то камера делает фото подряд с паузой примерно 30 миллисекунд, это время необходимо для расчета экспозиции.
В случае появления сообщения о пропуске кадров Skipping frame X to restart at frame Y:
- увеличить паузу между кадрами ( параметр -tl );
- добавить в команду параметр -md 1 — ручная установка режима съемки в 1 ( подробно о режимах здесь);
- добавить в команду параметр -bm — включение режима burst capture mode ( режим захвата пакетов).
После этого все полученные снимки нужно собрать в одно видео при помощи утилиты avconv .
Если утилита не установлена в системе, установить её можно командой:
Утилита avconv требовательна к нумерации файлов.
В случае, если необходимо собрать видео из файлов, нумерация которых начинается не с 0000 , необходимо привести имена файлов к виду, подходящему для обработки утилитой avconv
- -y — наличие флага разрешает, не спрашивая, перезаписывать выходной файл.
- -r n — в переменной n указывается количество кадров в секунду выходного видео, например, — 10 кадров в секунду.
- -i name — шаблон имен файлов входной последовательности, например, -i myphoto%4d.jpg , где фрагментом %4d задается формат нумерации ( 4 цифры).
- -vcodec — задает кодек, при помощи которого нужно кодировать видео, например, для использования кодека H.264, нужно передать значение параметра libx264 : -vcodec libx264 ( для получения списка доступных кодеков нужно утилите avconv передать параметр -codecs ).
- -q:v n — качество выходного видео, n — значение из диапазона от 1 ( самое лучшее) до 31 ( самое худшее).
- -start_number start — если нумерация последовательности начинается не с 0 , то start принимает значение первого номера в последовательности, например, если последовательность содержит файлы с именами image_0213.jpg , image_0214.jpg , image_0215.jpg и т.д., то start =213: -start_number 213
Использование камеры из Python — библиотека PiCamera
Помимо стандартных утилит, камеру можно использовать программными методами. Такой подход необходим, например, при построении систем безопасности, когда нужно активизировать запись, при наступлении какого-нибудь события или по расписанию.
Для оффлайн-установки библиотеки PiCamera доступен репозиторий.
Для работы с камерой в языке Python, понадобится библиотека PiCamera, которая предустановлена в системе. Если по какой-то причине её нет, то установить библиотеку можно командой:
Когда библиотека установлена, в скетче её необходимо импортировать:
Также, для работы с временными паузами, нужно импортировать функцию sleep() из библиотеки time :
Далее создается экземпляр класса PiCamera , с которым удобно работать:
Для корректного завершения работы с камерой и высвобождения занятых ресурсов, необходимо использовать метод close() . При вызове этого метода, будет также остановлена вся активность камеры — закрыто окно предпросмотра и завершена активная запись:
В соответствии с условностями, вызывать метод close() необходимо в разделе finally блока try :
Для проверки работоспособности можно на 10 секунд вызвать окно предпросмотра ( preview window):
Для окна предпросмотра можно устанавливать прозрачность:
Теперь, можно, по аналогии с утилитами raspistill и raspivid , при помощи объекта camera сделать фото с камеры:
Или записать видео:
На фото/видео и окно предпросмотра можно накладывать текст и изменять его параметры — размер, цвет, цвет фона. В аннотациях, помимо цифр и знаков, допустимы только буквы латинского алфавита, при попытке отобразить кириллический символ будет выведена ошибка. В примере, в качестве текста используется актуальное время, которое обновляется каждые 200 мс:
Особенностью использования цветов отображения текста на изображении с камеры ( annotate) является различие в задании цветов для фона ( annotate_background ) и самого текста ( annotate_foreground ). Дело в том, что цвета для фона можно задавать удобными значениями Color('yellow') , Color('blue') , Color('purple') и т.д., в то время как цвет текста задается в формате YUV — Color(y=0.2, u=0, v=0) . Но не стоит пугаться сложности формул конвертации RGB в YUV — в свойстве annotate_foreground поддерживается только составляющая Y, которая по сути отвечает за яркость текста. На это указывает справка к классу camera :
Объект camera позволяет задавать настройки для камеры:
И изменять их во времени:
Конструктор класса PiCamera позволяет задавать некоторые настройки при создании экземпляра класса PiCamera :
Перед тем, как сделать фото или записать видео, можно настроить разрешение и частоту кадров:
Причем, отдельно задать размер фото/видео можно при вызове методов capture() и start_recording() , передав нужное значение параметра resize :
К изображению камеры можно применять различные эффекты:
Аналогичным образом можно перебрать варианты настройки баланса белого awb_mode и варианты режимов экспозиции exposure_mode :
При помощи метода capture_continuous() , не составит труда сгенерировать набор фотографий для Timelapse. В примере фото делается в начале каждого часа:
Отключить мешающий светодиод можно свойством led :
Использование камеры из Python — библиотека PiCamera ( продвинутый уровень)
Библиотека PiCamera предоставляет очень широкие возможности по взаимодействию с камерой. Ниже представлены примеры решения некоторых неочевидных задач.
Захват видео в несколько потоков ( максимум 4). Для каждого из них, при помощи параметра resize можно устанавливать индивидуальное разрешение. Каждый поток идентифицируется параметром splitter_port ( 0, 1, 2, 3):
Разделение видеопотока и сохранение его в разные файлы. Функция бывает полезна, например, для циклической записи видеоданных равной продолжительности в определенное количество файлов, таким образом, что, после того, как будет записан последний файл, данные начнут записываться заново в первый файл ( принцип работы видеорегистратора).
При чем возможна реализация двумя способами. При помощи split_recording() :
И при помощи record_sequence() :
Постоянная циклическая запись видеопотока в буфер с последующим сохранением его в файл по заданному сигналу. При использовании этого способа можно строить системы безопасности, в которых запись потока в файл будет производиться по заданному событию. Преимуществом данного способа является сохранение видео, которое также, при необходимости, будет содержать данные, предшествующие наступлению события.
В примере демонстрируется постоянная запись в буфер длительностью 20 секунд в течение 100 секунд, причем только последние 10 секунд будут сохранены в файл:
Далее в статье будет приведен пример системы безопасности с записью 15-секундного видео ( 5 секунд до наступления события и 10 секунд после).
Пример использования камеры Raspberry Pi 3 в системах безопасности.
Поскольку, тема детектирования движения и распознавания образов программным способом, будет затронута в следующих статьях, в данном примере о наступлении события движения будет сообщать датчик движения.
Датчик движения HC-SR501 (пироэлектрический, инфракрасный)В качестве датчика движения будет использоваться пьезоэлектрический инфракрасный датчик движения HC-SR501. Преимущество его использования заключается в том, что напряжение его питания должно быть в диапазоне 5-20 В, а уровень логической единицы на выходе равен 3,3 В. Эти параметры позволяют подключать датчик HC-SR501 напрямую к Raspberry Pi 3 без конвертеров питания и логических уровней.
Суть системы безопасности заключается в следующем — при детектировании датчиком движения в зоне действия, камера будет делать фото и отправлять его на заданный адрес электронной почты. Светодиод в схеме дублирует состояние датчика — загорается в моменты срабатывания и гаснет, когда датчик отключается.
Схема подключения ( принципиальная и наглядная):
Слева — принципиальная схема, справа — наглядная ( номинал резистора R1 — 220 Ом)От частого срабатывания датчика движения, пример дополнен программным « предохранителем» — переменная periodBetweenEvents — он не позволяет делать и отправлять фото чаще чем раз в 6- секунд.
- внедрить паузу, корректирующую время создания снимка ( строка 42 скетча);
- расположить камеру и датчик движения так, чтобы избегать таких проблем;
- при детектировании события начинать видеозапись заданной продолжительностью.
Но библиотека PiCamera, как уже было упомянуто выше, обладает возможностью осуществлять циклическую запись видео в буфер заданного размера. Это позволяет получить доступ к видеоданным, записанным до наступления события. В следующем примере, Малинка постоянно осуществляет запись в буфер длительностью 30 секунд. При наступлении события, в файл записывается 5 секунд до наступления события и 10 секунд после его наступления. Каждое последующее событие записывается в новый файл — его имя формируется из номера по порядку и даты/времени наступившего события.
Воспроизвести файлы *.h264 на Windows-ПК можно при помощи медиаплеера VLC.