Este proyecto demuestra cómo recibir imágenes de esta cámara y procesarlas en imágenes fijas y películas utilizando OpenCV y FFMPEG en Ubuntu 20.04 que se ejecuta en un modelo 4B de Raspberry Pi. La cámara envía el siguiente mensaje JSON a través de HTTP Post:
{
"body" : [
{
"name" : " battery_percent " ,
"value" : " 96 "
},
{
"name" : " 5MP_MC " ,
"frames" : 0 ,
"content_type" : " image/jpeg " ,
"value" : " "
}
]
}Los datos de la batería aterriza en la parte superior de la página de navegación de imágenes.

Para obtener más información sobre esta página, consulte el proyecto de configuración de la cámara. El resto de los datos se utilizan para procesar la carga útil value . (Ha sido eludido para la brevedad. Imagine una cadena codificada Base64 muy larga en su lugar). El campo name nos dice qué cámara envió los datos. Si tiene múltiples cámaras, simplemente dales nombres distintos y todo estará bien. El contador de frames nos hace saber si deberíamos esperar un solo JPEG o múltiplos. Los marcos están numerados desde cero, por lo que 0 marcos produce una imagen. Si obtenemos múltiplos, los separamos y los pedimos por número de cuadro. Si obtenemos el valor reservado de 255 que nos dice que hemos recibido una película AVI/MJPEG. Si pasa el número mágico y la validación de FFMPEG, lo convertimos en MP4 y lo guardamos como una película. Si no es así, intentamos guardar tantos marcos como podamos y al guardar imágenes numeradas en el marco. Consulte mjpeg_utils::save_avi_frames para obtener cómo se usa FFMPEG dentro de OpenCV para lograr todo este procesamiento de imágenes.
Revisé el proyecto para construir directamente en Ubuntu 20.04 (64 bits) para el modelo 4B de Raspberry Pi. Si está interesado en la versión anterior que usó Raspberry Pi OS (también conocido como Raspbian), acceda al repositorio en Commit 511C7B8
Si aún no lo has hecho:
sudo apt-get install build-essential libcurl-dev libmagic-dev cmake Es ampliamente sabido que la parte más difícil del uso de OpenCV es obtenerlo y instalarse sus dependencias. Una vez que superes, es un placer usarlo. Construí este proyecto en un Raspberry Pi Model 4B con el último (octubre de 2020) Ubuntu 20.04 64 bits. Lo hice porque quería que el proyecto fuera accesible para aquellos con un presupuesto limitado. El PI es famoso y es asequible y tiene una capacidad más que suficiente para las tareas en cuestión. Dicho esto, si tiene acceso a una computadora portátil que ejecuta Ubuntu, puede encontrar que es una mejor opción. Para comenzar el edificio, instale Clang 9. Por cierto: puede tener la tentación de construir con GCC; Si lo haces funcionar, eres un mejor maestro de construcción que yo. Después de eso, instale OpenCV y sus dependencias. Por último, ejecute cmake de la manera habitual en la carpeta Root Project.
Como raíz, haga lo siguiente;
/usr/lib/cgi-bin/ si renombró el proyecto en cmakelists.txt El binario también tendrá un nuevo nombre. Asegúrese de reflejar este nombre en HTTP_HOST_URL en la plataforma.ini del proyecto de la cámara.sudo a2enmod cgisudo systemctl restart apache2/etc/apache2/ports.conf y agregue Listen 4444 en una línea a continuación, Listen 80 y guarde el archivo. -1. Como root, abra /etc/apache2/sites-available/000-default.conf y pegue lo siguiente justo debajo de la etiqueta de cierre </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. Como root, haga el directorio /var/www/html/motion_camera y copie el contenido de la carpeta web_root de este proyecto.
-3. Arregle la propiedad, el grupo y los permisos.
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. Cuando haya terminado /var/www/html/motion_camera contendrá:
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. Ahora puede probar la configuración señalando su navegador a http: // your_server: 4444/motion_camera
Una de las cosas útiles sobre el diseño de la interfaz CGI es que todos los mensajes de error deben escribirse en el flujo de error estándar; stderr . El servidor web escribe en su registro de errores; /var/log/apache2/error.log . Si este CGI encuentra un error, escribirá un mensaje útil al respecto en este archivo. Para desactivar esta salida editar debug_output.hpp y comentar DEBUG_OUTPUT
Ciertamente no. El estándar de la interfaz CGI es compatible con muchos servidores HTTP diferentes. Debe tener pocas dificultades para adaptar este proyecto para trabajar con su servidor web elegido.
También hay herramientas que puede encontrar útiles para usted en otros proyectos. Por ejemplo;
std::map<std::string, std::vector<std::string>> De esto puede crear un proyecto que maneja las solicitudes HTML.std::map<std::string, std::vector<std::string>> - uno para variables y otro para archivos. A partir de esto, puede crear un proyecto donde se utilicen los formularios para controlar un sistema robot/incrustado o su Raspberry Pi. Para ayudarlo a comenzar, hay una forma HTML de todo, pero la cocina. Edite la etiqueta <form> en la parte superior y cambie el atributo action para reflejar el nombre de su servidor. Si encuentra un error, cree un problema. Si desea contribuir, envíe una solicitud de extracción.
Usé Doxygen para crear la documentación del proyecto. Puedes leerlo aquí.
Las siguientes fueron referencias útiles en el desarrollo de este proyecto.