Этот проект демонстрирует, как получать изображения с этой камеры и обрабатывать их в неподвижные изображения и фильмы, используя OpenCV и FFMPEG на Ubuntu 20.04, работающем на модели Raspberry Pi 4B. Камера отправляет следующее сообщение JSON через http post:
{
"body" : [
{
"name" : " battery_percent " ,
"value" : " 96 "
},
{
"name" : " 5MP_MC " ,
"frames" : 0 ,
"content_type" : " image/jpeg " ,
"value" : " "
}
]
}Данные батареи приземляются в верхней части страницы просмотра изображения.

Для получения дополнительной информации об этой странице см. Проект «Настройки камеры». Остальные данные используются для обработки полезной нагрузки value . (Это было выполнено для краткости. Представьте себе очень длинную строку BASE64, кодируемая на своем месте.) В поле name сообщается, какая камера отправила данные. Если у вас есть несколько камер, просто дайте им различные имена, и все будет хорошо. Счетчик frames дает нам знать, следует ли мы ожидать одного JPEG или кратных. Кадры пронумерованы от нуля, поэтому 0 кадров дают одну картину. Если мы получим множество, мы разделим их на части и заказываем их по номеру кадров. Если мы получим зарезервированную стоимость 255 , которая сообщает нам, что мы получили фильм AVI/MJPEG. Если он проходит магическое число и проверку FFMPEG, мы конвертируем его в MP4 и сохраняем его как фильм. Если это не так, мы пытаемся сохранить как можно больше кадров, и отступаем на сохраненные кадры. См. mjpeg_utils::save_avi_frames для того, как FFMPEG используется в OpenCV для выполнения всей этой обработки изображений.
Я пересмотрел проект, чтобы построить непосредственно на Ubuntu 20.04 (64 бит) для модели Raspberry Pi 4b. Если вы заинтересованы в предыдущей версии, в которой использовались OS Raspberry Pi OS (AKA Raspbian).
Если вы еще этого не сделали:
sudo apt-get install build-essential libcurl-dev libmagic-dev cmake Широко известно, что самой сложной частью использования OpenCV является его установка и его зависимости. Как только вы пройдете мимо, это приятно использовать. Я построил этот проект на модели Raspberry Pi 4B, управляя последним (октябрь 2020 г.) Ubuntu 20.04 64 -бит. Я сделал это, потому что хотел, чтобы проект был доступен для тех, кто имел ограниченный бюджет. PI, как известно, доступен по цене, и он имеет более чем достаточную возможность для задач под рукой. Тем не менее, если у вас есть доступ к ноутбуку под управлением Ubuntu, вы можете найти этот лучший вариант. Чтобы начать здание, установите Clang 9. Кстати: у вас может возникнуть соблазн строить с помощью GCC; Если вы заставите его работать, вы лучший мастер сборки, чем я. После этого установите OpenCV и его зависимости. Наконец, запустите cmake обычным способом в папке Project Root.
Как корень, сделайте следующее;
/usr/lib/cgi-bin/ Если вы переименовали проект в cmakelists.txt, бинарник также будет иметь новое имя. Обязательно отразите это имя в HTTP_HOST_URL в платформе проекта камеры.sudo a2enmod cgisudo systemctl restart apache2/etc/apache2/ports.conf ports.conf и добавьте Listen 4444 в строке ниже Listen 80 и сохранить файл. -1 Как root, Open /etc/apache2/sites-available/000-default.conf и вставьте следующее чуть ниже закрывающего </VirtualHost> .
<VirtualHost *:4444>
<Directory /var/www/html/motion_camera>
Options +Indexes
AddType image/svg+xml svg svgz
AddEncoding gzip svgz
<IfModule mod_autoindex.c>
IndexOptions IgnoreCase FancyIndexing HTMLTable SuppressHTMLPreamble FoldersFirst VersionSort NameWidth=* DescriptionWidth=* XHTML IconHeight=16 IconWidth=16
IndexIgnore ..
IndexOrderDefault Descending Name
IndexStyleSheet ./fancy-index/style.css
HeaderName ./fancy-index/header.html
ReadmeName ./fancy-index/footer.html
# IGNORE THESE FILES
IndexIgnoreReset ON
IndexIgnore fancy-index
# DEFAULT ICON
DefaultIcon ./fancy-index/icons/file-text.svg
AddIcon ./fancy-index/icons/back.svg ..
AddIcon ./fancy-index/icons/file-directory.svg ^^DIRECTORY^^
# https://github.com/file-icons/source
AddIcon ./fancy-index/icons/file-media.svg .jpg .jpeg
AddIcon ./fancy-index/icons/Video.svg .avi .mp4
# https://upload.wikimedia.org/wikipedia/commons/d/da/Battery-303889.svg
AddIcon ./fancy-index/icons/battery.svg .pwr
AddDescription "MPEG Layer 4 Format" .mp4
AddDescription "Joint Photographics Experts Group" .jpg .jpeg .jpe .jfif
AddDescription "Audio Video Interleave - Motion JPEG" .avi
AddDescription "Camera battery power available" .pwr
</IfModule>
</Directory>
</VirtualHost>
-2 Как root, сделайте Directory /var/www/html/motion_camera и скопируйте содержимое папки Web_Root этого проекта.
-3 Исправьте право собственности, группу и разрешения.
sudo mkdir /var/www/html/motion_camera
cd /var/www/html/motion_camera
sudo chown -R www-data:www-data
sudo find . -type f -exec chmod 0644 {} ;
sudo find . -type d -exec chmod 0755 {} ; -4 Когда вы закончите /var/www/html/motion_camera будет содержать:
ls -al /var/www/html/motion_camera/fancy-index/
total 72
drwxr-xr-x 3 www-data www-data 4096 Jun 9 09:37 .
drwxr-xr-x 3 www-data www-data 40960 Jun 15 09:06 ..
-rw-r--r-- 1 www-data www-data 66 Jun 5 15:53 footer.html
-rw-r--r-- 1 www-data www-data 295 Jun 5 16:05 header.html
drwxr-xr-x 2 www-data www-data 4096 Jun 8 15:35 icons
-rw-r--r-- 1 www-data www-data 6322 Jun 8 15:48 script.js
-rw-r--r-- 1 www-data www-data 3170 Jun 9 09:37 style.css-5 Теперь вы можете проверить конфигурацию, указав свой браузер на http: // your_server: 4444/motion_camera
Одна из удобных вещей в дизайне интерфейса CGI заключается в том, что все сообщения об ошибках должны быть записаны в стандартный поток ошибок; stderr . Веб -сервер записывает их в журнал ошибок; /var/log/apache2/error.log . Если этот CGI столкнется с ошибкой, он напишет полезное сообщение об этом в этот файл. Чтобы отключить этот вывод Edit Debug_output.hpp и прокомментировать DEBUG_OUTPUT
Конечно нет. Стандарт интерфейса CGI поддерживается множеством различных серверов HTTP. У вас должно быть мало трудности адаптации этого проекта для работы с выбранным вами веб -сервером.
Есть также инструменты, которые вы можете найти для вас полезными в других проектах. Например;
std::map<std::string, std::vector<std::string>> Вы можете создать проект, который обрабатывает запросы html.std::map<std::string, std::vector<std::string>> - один для переменных, а другой для файлов. Из этого вы можете создать проект, в котором формы используются для управления роботом/встроенной системой или вашей малиновой PI. Чтобы помочь вам начать работу, есть HTML-форма, но html, но и китчен-sink. Измените тег <form> вверху и измените атрибут action , чтобы отразить имя вашего сервера. Если вы найдете ошибку, создайте проблему. Если вы хотите внести свой вклад, отправьте запрос на привлечение.
Я использовал Doxygen для создания документации проекта. Вы можете прочитать это здесь.
Следующие были полезными ссылками в разработке этого проекта.