
Я сильно верю в обучение через практику, через создание чего-то нового. А для того чтобы что-то создавать, нужно чтобы работа приносила бы удовольствие.
Я начну рассказ о моём новом проекте с того, что раскрою причины, по которым решил попытаться создать камеру-ловушку на основе Raspberry Pi.
Я живу в Лондоне, мой сад часто посещают местные представители дикой природы. Случается это так часто, что я, заядлый садовник, мало-помалу начал расстраиваться. Разбитые горшки, выкопанные из земли растения, съеденные фрукты и овощи…
Я видел в своём саду маленьких лис (они — просто прелесть), больших лис, кошек (не моих), птиц. А однажды меня даже посетил ястреб-перепелятник.

Ястреб-перепелятник
Кто ещё заберётся в мой сад под покровом ночи?

Разглядеть животное на этом снимке не так уж и просто
Какие ещё поводы мне нужны для того чтобы создать камеру-ловушку на основе Raspberry Pi, Python, TensorFlow и чего угодно ещё? И камера у меня должна получиться очень хорошая.
Кто-то может сказать, что самому такую камеру делать не надо, что можно купить готовую, которая отлично справится с задачей наблюдения за дикими животными.
Идея это здравая, но это будет и вполовину не так интересно.
Модули камеры для Raspberry Pi
Я начал с изучения вопроса о том, какие типы камер можно подключить к одноплатному компьютеру Raspberry Pi.
Самые популярные подобные камеры — это те, которые напрямую подключаются к Raspberry Pi с использованием MIPI-коннектора. Преимущества камер такого типа заключается в том, что данные между камерой и платой передаются очень быстро. Существует и простой в использовании API для работы с камерой.
Я попробовал этот API и выяснил, что в нём имеется множество полезных функций, которые позволяют записывать видео и во время записи делать снимки. Благодаря этому я могу, используя простые и понятные инструменты, одновременно обнаруживать движение и записывать видео.
Есть три вида модуля камеры для Raspberry Pi. Ниже приведён сокращённый вариант таблицы с характеристиками таких модулей.
Camera Module v1 | Camera Module v2 | HQ Camera | |
Цена нетто | $25 | $25 | $50 |
Размер | Около 25 × 24 × 9 мм | 38 x 38 x 18.4 мм (не включая оптику) | |
Вес | 3 г | 3 г | |
Разрешение снимков | 5 М | 8 М | 12.3 М |
Видеорежимы | 1080p30, 720p60 и 640 × 480p60/90 | 1080p30, 720p60 и 640 × 480p60/90 | 1080p30, 720p60 и 640 × 480p60/90 |
Интеграция с Linux | Драйвер V4L2 | Драйвер V4L2 | Драйвер V4L2 |
C-API | OpenMAX IL и другие | OpenMAX IL и другие | |
Сенсор | OmniVision OV5647 | Sony IMX219 | Sony IMX477 |
Разрешение сенсора | 2592 × 1944 пикселей | 3280 × 2464 пикселей | 4056 x 3040 пикселей |
Размер рабочей области сенсора | 3,76 × 2,74 мм | 3,68 x 2,76 мм (диагональ — 4,6 мм) | 6,287 x 4,712 мм (диагональ — 7,9 мм) |
В этой таблице приведены сведения об официальных модулях камеры, но можно найти камеры сторонних производителей, которые будут работать с Raspberry Pi. Модули камеры используют для обработки данных с сенсора GPU Raspberry Pi.
Так как при использовании модуля камеры обработкой изображений занимается сам Raspberry Pi, оказывается, что выбор сенсоров камер весьма ограничен. У каждого сенсора имеется собственный API, поэтому поддержка различных типов сенсоров — непростая задача.
Запись видео в условиях низкой освещённости
Я собираюсь создать камеру-ловушку для наблюдения за дикими животными. Поэтому её возможностей должно быть достаточно и для работы днём, и для работы ночью. То есть, в ней должен быть сенсор, способный записывать видео в условиях низкой освещённости. Весьма желательно, чтобы он передавал бы реальный цвет снимаемых объектов. В плохих условиях освещённости Camera Module v1 и v2 работают не очень хорошо. Для того чтобы с их помощью можно было бы в таких условиях что-нибудь снять, нужно использовать ИК-подсветку и убрать из них ИК-фильтр. Процедура подготовки камеры к съёмкам в плохих условиях освещённости зависит от конкретной модели камеры. Но тут появляется ещё одна проблема, которая заключается в том, что получаемые изображения имеют розовый оттенок. При использовании подобных камер нужен механизм, который задействует ИК-фильтр при съёмках днём и убирает этот фильтр при съёмках ночью.

Изображение с камеры для Raspberry Pi, снятое днём в плохих условиях освещённости
Но существует новая камера для Raspberry Pi, которая в таблице обозначена как HQ Camera. Правда, я не вполне уверен в её «ночных» возможностях. Она основана на сенсоре Sony IMX477, от которого в плохих условиях освещённости можно ожидать получения более качественной картинки, чем могут выдать камеры предыдущих поколений. Может ли этот сенсор выдавать правильную цветную картинку в темноте, я ещё собираюсь выяснить. Но мои предварительные исследования камер, касающиеся их спецификаций, говорят о том, что вряд ли он на это способен.
Sony Starvis — замечательный сенсор для камер
У компании Sony есть особое семейство сенсоров для камер, используемых, в основном, для видеонаблюдения. Это — Sony Starvis. Эти сенсоры представляют собой крайне продвинутые устройства, способные давать качественное цветное изображение в условиях низкой освещённости при всего лишь 0,001 лк. Люкс (лк) — это единица измерения освещённости.
Для того чтобы было понятнее, приведу несколько примеров. Практически полная темнота — это 0,0001 лк. А именно: нет солнечного света, нет света луны и звёзд, небо затянуто тучами, нет искусственных источников освещения. Мне неизвестны сенсоры для камер, способные снимать в полной темноте.
Но если небо чистое, то звёзды дают освещённость в 0,002 лк. Хотя и в таких условиях всё ещё очень темно, сенсор Sony Starvis способен снимать при освещённости, в два раза меньше этой. Как по мне, так это просто потрясающе.
Вот страница из Википедии, где можно найти дополнительные примеры.
Будем надеяться, что я смог донести до вас идею о том, что Sony Starvis — это идеальный сенсор для камеры-ловушки.
Главный минус этого сенсора в том, что нет камер для Raspberry Pi, в которых он применяется. Но если бы мне попалась USB-камера или IP-камера с таким сенсором, я бы что-нибудь придумал и подключил бы её к Raspberry Pi.
Собственно говоря, я нашёл такую камеру.
Я не хотел слишком сильно вкладываться в этот проект, поэтому купил подходящую IP-камеру с Sony Starvis на Aliexpress. Эта покупка обошлась мне, если я всё правильно помню, в £20.
Сравнивать камеру для Raspberry Pi и эту камеру — это как сравнивать день и ночь. И я ничуть не преувеличиваю. Да вот — сами посмотрите.

Камера с сенсором Sony Starvis IMX307, съёмка в тёмной комнате

Камера Raspberry Pi v2 — та же комната, но другая точка съёмки
Для камеры-ловушки и для камеры видеонаблюдения очень важна возможность делать качественные записи в плохих условиях освещённости.
Кто-то может сказать, что запись цветного видео в плохих условиях освещённости — это не так уж и важно, что можно обойтись простой камерой с ИК-подсветкой. Но я не могу использовать ИК-подсветку, так как собираюсь разместить камеру в помещении и направить её на сад через окно. А если направить источник ИК-излучения на стекло, стекло поведёт себя как зеркало и камера «ослепнет».
Если же говорить о камерах для Raspberry Pi, то они хорошо подходят для каких-нибудь простых проектов или для изучения чего-то нового. Но если заняться каким-нибудь хотя бы наполовину серьёзным проектом, тогда просто необходимо пользоваться более качественными камерами.
Применение USB-камеры (или даже IP-камеры) открывает совершенно новые возможности. Кроме того, если у вас при этом есть ещё и обычная камера для Raspberry Pi, вы можете употребить её для каких-нибудь экспериментов из сферы искусственного интеллекта.
Установка и настройка камеры для Raspberry Pi
Займёмся подключением Camera Module v2 к плате. Это, на самом деле, очень просто.

Camera Module v2
У камеры имеется сине-белый шлейф. Его нужно подключить к CSI-коннектору платы. Синяя сторона шлейфа должна быть обращена к задней части платы.
Я использовал корпус для камеры, напечатанный на 3D-принтере. Соответствующие файлы я нашёл на Thingiverse. Но подходящий корпус, совсем недорогой, можно найти и, например, на Amazon.

Корпус для камеры
Теперь пришло время включить камеру.
После включения Raspberry Pi нужно открыть окно терминала.

Терминал
Затем надо выполнить такую команду:
$ sudo apt update
А потом — такую:
$ sudo apt full upgrade
Это делается для того чтобы обеспечить использование на плате последней версии Raspbian и самых свежих патчей и обновлений.
После этого надо выполнить в терминале следующую команду:
sudo raspi-config

Работа с raspi-config
Здесь нас интересует раздел Interfacing Options>P1 Camera
. Потом надо выбрать команду Finish
и перезагрузить Raspberry Pi.
Съёмка фотографий с использованием raspistill
Теперь камера должна быть готова к работе. Проверим её с помощью raspistill
. Снова откроем терминал и введём там такую команду:
raspistill -v -o test.jpg
Вот какое чудесное фото сняла моя камера.

Снимок с камеры для Raspberry Pi
Запись видео с помощью raspivid
Фотографии — это хорошо, но запись видео — это уже гораздо лучше. Тут нам на помощь придёт raspivid
:
raspivid -o vid.h264
Такая команда позволяет записать видео длительностью 5 секунд.
Если нужно снять более длительное видео — этой команде понадобится передать параметр -t
с указанием длительности видео в миллисекундах. Например, следующая команда позволяет записать видео длительностью в 30 секунд:
raspivid -o vid.h264 -t 30000
Настройка потокового вещания
А теперь — самое интересное. Для того чтобы видеть то же самое, что «видит» камера, можно воспользоваться такой командой:
raspivid -o - -t 0 -n | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264
Она создаёт RTSP-поток, подключиться к которому можно из локальной сети.
Итоги
Теперь, когда я разобрался с камерами для Raspberry Pi, можно развивать проект дальше, а именно, устанавливать на Raspberry Pi 4 TensorFlow, Open CV и Python и приступать к написанию кода. Об этом я планирую рассказать в следующих моих материалах. Вот, кому интересно, мой канал на YouTube, там вы можете найти видео, связанные с этим проектом.
Работали ли вы с камерами для Raspberry Pi?

Автор: ru_vds