Ce projet montre comment recevoir des images de cette caméra et les transformer en images fixes et films à l'aide d'OpenCV et FFMPEG sur Ubuntu 20.04 fonctionnant sur un modèle Raspberry Pi 4B. La caméra envoie le message JSON suivant via la publication HTTP:
{
"body" : [
{
"name" : " battery_percent " ,
"value" : " 96 "
},
{
"name" : " 5MP_MC " ,
"frames" : 0 ,
"content_type" : " image/jpeg " ,
"value" : " "
}
]
}Les données de la batterie atterrissent en haut de la page de navigation d'image.

Pour plus d'informations sur cette page, consultez le projet Paramètres de la caméra. Le reste des données est utilisé pour traiter la charge utile value . (Il a été éliminé pour la concision. Imaginez une très longue chaîne codée Base64 à sa place.) Le champ name nous indique quelle caméra a envoyé les données. Si vous avez plusieurs caméras, donnez-leur simplement des noms distincts et que tout ira bien. Le compteur frames nous permet de savoir si nous devons nous attendre à un seul JPEG ou à plusieurs multiples. Les cadres sont numérotés à partir de zéro, donc 0 trames donne une image. Si nous obtenons des multiples, nous les séparons et les commandons par numéro de trame. Si nous obtenons la valeur réservée de 255 ce qui nous dit que nous avons reçu un film Avi / MJPEG. S'il passe le nombre magique et la validation FFMPEG, nous le convertissons en MP4 et l'enregistrons en tant que film. Si ce n'est pas le cas, nous essayons d'enregistrer autant de trames que possible et de se replier pour enregistrer des images numérotées de trame. Voir mjpeg_utils::save_avi_frames pour la façon dont FFMPEG est utilisé dans OpenCV pour accomplir tout ce traitement d'image.
J'ai révisé le projet pour construire directement sur Ubuntu 20.04 (64 bits) pour le modèle Raspberry Pi 4B. Si vous êtes intéressé par la version précédente qui a utilisé Raspberry Pi OS (AKA Raspbian), accédez au référentiel à Commit 511C7B8
Si vous ne l'avez pas déjà fait:
sudo apt-get install build-essential libcurl-dev libmagic-dev cmake Il est largement connu que la partie la plus difficile de l'utilisation d'OpenCV est l'installation de l'installation et de ses dépendances. Une fois que vous avez dépassé, c'est un plaisir à utiliser. J'ai construit ce projet sur un modèle Raspberry Pi 4B exécutant le dernier (octobre 2020) Ubuntu 20.04 64 bits. Je l'ai fait parce que je voulais que le projet soit accessible à ceux qui ont un budget limité. Le PI est célèbre abordable et il a plus que suffisamment de capacités pour les tâches à accomplir. Cela dit, si vous avez accès à un ordinateur portable exécutant Ubuntu, vous pourriez trouver une meilleure option. Pour commencer le bâtiment, installez Clang 9. BTW: Vous pouvez être tenté de construire avec GCC; Si vous le faites fonctionner, vous êtes un meilleur maître de construction que moi. Après cela, installez OpenCV et ses dépendances. Enfin, exécutez cmake de la manière habituelle dans le dossier Root du projet.
En tant que racine, faites ce qui suit;
/usr/lib/cgi-bin/ si vous avez renommé le projet dans cMakelists.txt le binaire aura également un nouveau nom. Assurez-vous de refléter ce nom dans HTTP_HOST_URL dans la plate-forme de la caméra du projet.sudo a2enmod cgisudo systemctl restart apache2/etc/apache2/ports.conf et ajoutez Listen 4444 sur une ligne ci-dessous Listen 80 et enregistrez le fichier. -1. En tant que racine, ouvrir /etc/apache2/sites-available/000-default.conf et collez ce qui suit juste en dessous de la balise de fermeture </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. En tant que racine, faites le répertoire /var/www/html/motion_camera et copiez le contenu du dossier web_root de ce projet.
-3. Corrigez la propriété, le groupe et les autorisations.
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. Lorsque vous avez terminé /var/www/html/motion_camera contiendra:
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. Vous pouvez maintenant tester la configuration en pointant votre navigateur vers http: // your_server: 4444 / motion_camera
L'une des choses pratiques sur la conception de l'interface CGI est que tous les messages d'erreur doivent être écrits dans le flux d'erreur standard; stderr . Le serveur Web les écrit dans son journal d'erreur; /var/log/apache2/error.log . Si ce CGI rencontre une erreur, il écrira un message utile à ce sujet dans ce fichier. Pour désactiver cette sortie, modifiez Debug_output.hpp et commentez DEBUG_OUTPUT
Certainement pas. La norme d'interface CGI est prise en charge par de nombreux serveurs HTTP différents. Vous devriez avoir peu de difficulté à adapter ce projet pour travailler avec votre serveur Web choisi.
Il existe également des outils que vous pourriez vous trouver utiles dans d'autres projets. Par exemple;
std::map<std::string, std::vector<std::string>> À partir de cela, vous pouvez créer un projet qui gère les demandes HTML.std::map<std::string, std::vector<std::string>> - l'un pour les variables et un autre pour les fichiers. À partir de cela, vous pouvez créer un projet où les formulaires sont utilisés pour contrôler un système robot / intégré ou votre Raspberry Pi. Pour vous aider à démarrer, il y a tout un formulaire HTML-HTML. Modifiez la balise <form> en haut et modifiez l'attribut action pour refléter le nom de votre serveur. Si vous trouvez un bogue, veuillez créer un problème. Si vous souhaitez contribuer, veuillez envoyer une demande de traction.
J'ai utilisé le doxygen pour créer la documentation du projet. Vous pouvez le lire ici.
Les éléments suivants étaient des références utiles dans le développement de ce projet.