Dans le tutoriel précédent, nous avons vu comment piloter (afficher l’image en live, enregistrer un cliché et un clip vidéo à l’aide du clavier) sur un Raspberry Pi sous Raspbian. Dans ce tutoriel, nous allons faire la même chose mais sur un Orange Pi Lite (version WiFi). Il n’est malheureusement pas possible d’utiliser la librairie Picamera qui a été conçue pour fonctionner exclusivement pour le Raspberry Pi. Nous allons donc devoir utiliser OpenCV qui est une librairie Open Source extrêmement puissante.
Matériel utilisé
Comme nous l’avons vu dans cet article, le connecteur CSI de l’Orange Pi est différent de celui du Raspberry Pi. Je me suis procuré la caméra 2MP vendu par Orange Pi (environ 6€ sur Aliexpress). La qualité de l’image est loin d’égaler celle de la caméra v2.1 8MP du Raspberry Pi, mais pour débuter, le rapport qualité/prix est imbattable.
Orange Pi Lite | |
Alimentation 5V – 3A
Ou un cable USB, environ 2,50€ |
|
Armbian sur carte SD 8Go classe 10 | |
Caméra carte 2MP d’origine Orange Pi |
Préparation de l’environnement
Commençons par préparer l’environnement.
Mise à jour du système Armbian
Sauf si vous venez de le faire, le mieux est de toujours commencer par une petite mise à jour du système
sudo apt-get update sudo apt-get upgrade
Installation de python 2.7
Une fois le système à jour, on peut installer Python 2.7. Pourquoi pas Python 3 me direz-vous ? C’est possible sans aucun problème. A vous de choisir en fonction de votre niveau. Si vous débutez, vous trouverez beaucoup plus d’exemples sur Python 2.7.
sudo apt-get install python-dev
On en profite pour installer le gestionnaire de paquets pour python (pip). En effet, tous les dépôts risquent de ne pas être déclarés dans les sources de la distribution Armbian. Excécutez la commande suivante pour installer la commande pip :
sudo apt-get install python-pip
Installation d’OpenCV pour Python
On trouve beaucoup de tutoriels sur internet qui expliquent comment installer OpenCV (sur Raspberry Pi ou Orange Pi) dans un environnement virtuel à partir du code source. C’est une solution, mais pour l’avoir testé, c’est long (une grosse demi-journée de compilation sur mon Orange Pi Lite) et surtout l’utilisation de l’environnement virtuel est fastidieuse, surtout pour si vous débutez. Ici, on va suivre le chemin le plus court, on va simplement installer la librairie avec cette simple commande
sudo apt-get install python-opencv
Acceptez toutes les questions posées.
Programme test : affichage en direct de la caméra de l’Orange Pi
Placez vous dans le répertoire de votre choix et ouvrez un nouveau document, par exemple testcam_orangepi.py. Collez le code ci-dessous.
import cv2 c = cv2.VideoCapture(0) while(1): _,f = c.read() cv2.imshow('Camera Orange Pi',f) k = cv2.waitKey(5) if k==1048603: #Esc key to stop, or 27 depending your keyboard #Touche ESC appuyee. le code peut dependre du clavier. Normalement 27 break elif k==-1: continue #uncomment to know the code of of the key pressed #Decommenter pour connaitre le code de la touche pressee #else: #print k cv2.destroyAllWindows()
Que fait ce code ?
On appel la librairie OpenCV 2 (import cv2)
On créé un objet c qui capture le flux vidéo envoyé par la caméra (0), c’est à dire celle qui est reliée à /dev/video0.
c = cv2.VideoCapture(0)
On affiche l’image de la caméra jusqu’à ce que la touche Escape soit pressée
On lit le flux vidéo (c.read) et on le stocke dans la variable f (_,f = c.read()).
Ensuite on affiche le flux vidéo à l’aide de la fonction imshow qui prend comme paramètre :
- Le titre de la fenêtre dans laquelle sera diffusé le flux vidéo
- La variable qui contient le flux vidéo
cv2.imshow('Camera Orange Pi',f)
Premier test
Enregistrez le script (CTRL+X puis Y) et lancez le
python testcam_orangepi.py
Ah, ça ne fonctionne pas !
libv4l2: error setting pixformat: Operation not permitted HIGHGUI ERROR: libv4l unable to ioctl S_FMT libv4l2: error setting pixformat: Operation not permitted libv4l1: error setting pixformat: Operation not permitted libv4l2: error setting pixformat: Operation not permitted libv4l1: error setting pixformat: Operation not permitted HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /usr/local/opencv-2.4.10/modules/highgui/src/window.cpp, line 261 Traceback (most recent call last): File "testcv.py", line 7, in <module> cv2.imshow('e2',f) cv2.error: /usr/local/opencv-2.4.10/modules/highgui/src/window.cpp:261: error: (-215) size.width>0 && size.height>0 in function imshow
Pourquoi ça ne marche pas ?
Tout d’abord, on sait que la librairie cv2 (OpenCV) fonctionne. C’est déjà une bonne nouvelle, nous ne serons pas obligés de tout compiler à partir des sources ! En googlisant l’erreur (libv4l2: error setting pixformat: Operation not permitted), on tombe rapidement sur cet article du concepteur du script vidcopy qui permet de recopier le flux vidéo produit par la librairie v4l2loopback.
Installation de v4l2loopback et vidcopy
On va simplement suivre le tutoriel de Leonardo Lontra.
Installation de v4l2loopback
# git clone https://github.com/umlaeute/v4l2loopback # cd v4l2loopback/ # make && make install
Installation de vidcopy
vidcopy est un script qui va créer une sortie vidéo virtuelle (/dev/video1) dans laquelle sera recopiée le flux vidéo de la caméra physique (/dev/video0).
# apt-get install libv4l-dev # git clone https://github.com/lhelontra/vidcopy # cd vidcopy/ # gcc vidcopy.c -o vidcopy
Chargement des modules nécessaires
# modprobe gc2035 # modprobe vfe_v4l2 # sleep 5 # modprobe v4l2loopback
Maintenant, pour rendre les changements permanents, exécutez les commandes suivantes. Elles vont ajouter les lignes correspondantes aux modules dans le fichier de configuration /etc/modules. Les modules seront ainsi chargés automatiquement au prochaine démarrage.
echo "v4l2loopback" | sudo tee -a /etc/modules echo "gc2035" | sudo tee -a /etc/modules echo "vfe_v4l2" | sudo tee -a /etc/modules
Recopie du flux vers /dev/video1 avec vidcopy
Placez vous dans le répertoire de vidcopy et exécutez le script vidcopy.sh. Il prend comme paramètre :Voilà, il ne reste plus qu’à lancer le script vidcopy pour créer une nouvelle caméra virtuelle
- –w : largeur de l’image (1600 pixels pour une caméra 2MP
- –h : hauteur de l’image (1200 pixels au maximum pour une caméra 2MP)
- –r : nombre d’images par seconde. Par exemple 20 (30 au maximum)
- –i /dev/video0 : flux vidéo en entrée. video0 pour la caméra connectée sur le connecteur CSI de l’Orange Pi
- –o /dev/video1 : sortie du flux vidéo
- –f : format de sortie. Les formats suivants ont été testés avec succès : UYVY/YV12/YU12/NV12/NV21 par l’auteur du script
Pour la caméra 2MP d’Orange PI cela donne
./vidcopy -w 800 -h 600 -r 30 -i /dev/video0 -o /dev/video1 -f UYVY
Le script reste ouvert dans le terminal. On l’arrête avec la combinaison CTRL+C. Je n’ai pas encore assez de recul sur le script, mais en demandant une image de 800 x 600, la sortie bascule en 640 x 480.
Required width: 800 Required height: 600 Required FPS: 30 input device: /dev/video0 output device: /dev/video1 Driver Caps: Driver: "sunxi-vfe" Card: "sunxi-vfe" Bus: "sunxi_vfe sunxi_vfe.0" Version: 1.0 Capabilities: 05000001 FMT : CE Desc -------------------- 422P: planar YUV 422 YU12: planar YUV 420 YV12: planar YVU 420 NV16: planar YUV 422 UV combined NV12: planar YUV 420 UV combined NV61: planar YUV 422 VU combined NV21: planar YUV 420 VU combined HM12: MB YUV420 YUYV: YUV422 YUYV YVYU: YUV422 YVYU UYVY: YUV422 UYVY VYUY: YUV422 VYUY BA81: RAW Bayer BGGR 8bit GBRG: RAW Bayer GBRG 8bit GRBG: RAW Bayer GRBG 8bit GRBG: RAW Bayer RGGB 8bit BG10: RAW Bayer BGGR 10bit GB10: RAW Bayer GBRG 10bit BA10: RAW Bayer GRBG 10bit BA10: RAW Bayer RGGB 10bit BG12: RAW Bayer BGGR 12bit GB12: RAW Bayer GBRG 12bit BA12: RAW Bayer GRBG 12bit BA12: RAW Bayer RGGB 12bit Selected Camera Mode: Width: 640 Height: 480 PixFmt: UYVY capturing..
Il ne reste plus qu’à brancher le script python sur ce nouveau flux vidéo. Ouvrez le script python et remplacez 0 par 1 dans la fonction VideoCapture comme ceci c = cv2.VideoCapture(1). Enregistrez le lancez le script.
Et voilà ! Vous pouvez exploiter l’image de la caméra Orange Pi dans vos projets Python.
Enregistrer une image au clavier
Dernière petite chose pour terminer ce tutoriel, déclencher l’enregistrement d’une image au clavier. Ajoutez une variable pics_taken = 0 en début de code. Ensuite récupérez le code de la touche avec laquelle vous souhaitez déclencher l’enregistrement d’une image. Ici, c’est le 1048586 (Return). Ajoutez ce test et modifiez le chemin de destination des images. C’est fait.
elif k==1048586: pics_taken += 1 cv2.imwrite('/home/pi/Desktop/img_' + str(pics_taken) + ".jpg", f)
Conclusion
Comme toujours avec l’Orange Pi, on dispose d’un rapport performance / prix bien meilleur que le Raspberry Pi à condition de mettre la main au clavier ;-). Coté performances, l’Orange Pi Lite avec son SoC quad-core et ses 512Mo de Ram est parfaitement en mesure de supporter le bureau XFCE d’Armbian, Open CV et Python. Reste à tester sur un projet plus complexe, par exemple de la reconnaissance faciale ou de la détection de mouvement.
- ESP32, broches GPIO et fonctions associées. I/O, PWM, RTC, I2C, SPI, ADC, DAC
- ESP32-CAM. Broches et équipements ESP-EYE, AI Thinker, TTGO T-Camera, M5Stack Timer Camera…
- ESP32-CAM. Quel modèle choisir ? ESP-EYE, AI Thinker, TTGO T-Camera, M5Stack Timer Camera…
- M5Stack Atomic GPS. Tracker ESP32 TinyGPS++, export GPX sur carte SD, visualisation sur Google Maps ou VSCode
- Home Assistant. Installer le snap sur NAS Synology sur une machine virtuelle Ubuntu
- ESP32-CAM. Souder l’antenne externe pour améliorer la portée et la stabilité du flux vidéo
Bonjour,
en effet, deux tests à effectuer pour finaliser cet excellent article :
1) de la reconnaissance de movement pour ne garder que les piétons (ainsi, en la plaçant comme judas sur la porte, on ne tiens pas compte des voitures qui passent, mais seulement des passants, voire des gens se présentant à la porte).
Petit sous-test : mémoriser les passants/visiteurs récurant pour les definer comme relevant ou non relevant (ainsi, on ne tient pas compte des voisins, mais bien des visiteurs curieux qui s’intéressent à savoir si il y a quelqu’un chez soi:autement dit, des voleurs))
2) la reconnaissance faciale servant alors à mémoriser les membres de la familles/amis (ou voisins à ne pas tenir compte et alors retirer des mouvements détectés qui auraient été stockés)
Merci.
Bonjour Migui. Je suis d’accord. On pourrait développer une version DIY de la caméra de surveillance Netatmo Presence (amzn.to/2mj5yZu). Pour le moment, je dois mettre mes compétences à jour en vision industrielle et en analyse d’image. Ca fait quelques années que je n’y ai pas touché. C’est dans un coin de ma tête 😉 A très bientôt.
Bonjour,
voice déjà une partie de la réponse quant à la capture de detection de movement avec un envoi vers Dropbox (on peut alors porter cela vers un serveur perso) avec lequel on peut peut-être jouer avec IFTTT pour envoyer un signal (sms, mail, vocal dans la maison, …) signalant une detection 😉
http://www.pyimagesearch.com/2015/06/01/home-surveillance-and-motion-detection-with-the-raspberry-pi-python-and-opencv/
Sinon il faut creuser le travail effectué par Robin David :
http://www.robindavid.fr/opencv-tutorial/motion-detection-with-opencv.html
https://github.com/RobinDavid/Motion-detection-OpenCV/blob/master/MotionDetector.py
Ou autre 😉
http://blog.cedric.ws/opencv-simple-motion-detection
https://github.com/cedricve/motion-detection
A+
Super, merci beaucoup. Tu vas plus vite que moi sur le sujet :-). Je vais regarder tout ça de près. Bon week end en tout cas.
Bonjour,
désireux de faire advancer le chmilblik, je viens de découvrir cet article de sept étapes pour faire tourner cela sur un RPi (donc très certainement idem pour OPi, BPi, …) :
https://thinkrpi.wordpress.com/2013/05/22/opencv-and-camera-board-csi/
A+
Merci pour l’info. Oui ça fonctionne sur OPI http://www.projetsdiy.fr/orange-pi-armbian-piloter-camera-python-opencv/ Je me suis arrêté à l’étape 6 🙂