Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Ordinateurs embarqués (SBC) > La carte Raspberry PI > Projets complets avec la Raspberry Pi > Vision par webcam avec une Raspberry Pi

Vision par webcam avec une Raspberry Pi

vendredi 9 novembre 2012, par Julien H.

Un robot mobile autonome peut servir à explorer un endroit où on ne se trouve pas. Pour l’acquisition d’images comme pour la transmission à distance, des solutions à bas-coût sont possibles grâce à une simple webcam de chat (15€) et une carte Raspberry Pi (35€ + câbles et carte mémoire).

C’est la solution qu’a choisi Greg pour la mise à jour 1.1 de son robot Baba.

Configuration requise

La manip’ présentée ici est effectuée avec une Raspberry Pi type B seconde version avec 256 Mo de mémoire vive.

La distribution GNU/Linux que nous avons choisie est une Occidentalis v1.1 basée sur Raspbian, elle-même basée sur Debian.

Ce n’est pas la première fois que nous utilisons une webcam sous Linux : en 2005, une webcam Philips Toucam II était utilisée avec les drivers video4l et le pilote optimisé grâce à un NDA [1] avec Philips qui a fait couler beaucoup d’encre.



Bien débuter

Nous préférons procéder pas à pas plutôt que de donner une liste d’instructions à saisir. Vous trouverez pléthore de tutoriels prêt à l’emploi sur Internet. Généralement les plus simples sont ceux qui fonctionnent le moins :(

Ainsi nous avons retenu la solution mjpg-streamer plutôt que la plus fréquente ffserver. Non seulement les explications que nous avons trouvées étaient plus précises, en admettant des limitations et des difficultés d’installation.

Concernant les performances, la page officielle sur Sourceforge annonce une consommation de 10% seulement pour un CPU tournant à 200 MHz pour une vidéo de 960x720 pixels.

Préparation

La première étape est de contrôler l’insertion de la webcam dans le port USB. En effet, pas la peine de perdre du temps à installer des logiciels si au bout de deux heures vous vous apercevez qu’il faut aller chercher une nouvelle caméra..

pi@raspberrypi ~ $ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 041e:406b Creative Technology, Ltd 

C’est fait, nous voyons bien la Creative Technology. A noter que la webcam va ensuite créer des périphériques vidéos (et audio s’il y a un microphone), généralement sur /dev/videoX où X est un nombre à partir de 0.

Il est préférable d’allumer votre Raspberry Pi une fois que la webcam est branchée. Même si "lsusb" vous montre vos nouvelles webcams, la création des périphériques ne se fait pas à chaud ou "hot-plug" (avec les modèles que j’ai utilisé, ce n’est peut être pas une généralité).

Avant d’installer de nouveaux logiciels, il faut procéder à la mise à jour de la carte :

sudo apt-get update
sudo apt-get upgrade

Cette mise à jour peut prendre 160 Mo et durer plus de vingt minutes.

On va ensuite vérifier les capacités de la caméra. Si vous en avez plusieurs (on fait beaucoup de récupération au club Pobot), vous pourrez ainsi vérifier laquelle convient le mieux à vos besoins.

Pour ce faire, on utilisera les outils de Vidéo4Linux (v4l), que l’on doit installer :

pi@raspberrypi ~ $ apt-get install v4l-utils v4l-conf

Une fois fait, on peut lancer différents outils, dont v4l2-ctl et v4l-info :

pi@raspberrypi ~ $ v4l2-ctl --list-devices
Philips 730 webcam (usb-bcm2708_usb-1.2):
	/dev/video1

VF0530 Live! Cam Chat IM (usb-bcm2708_usb-1.3):
	/dev/video0

pi@raspberrypi ~/webcams $ v4l-info /dev/video1

### v4l2 device info [/dev/video1] ###
general info
    VIDIOC_QUERYCAP
	driver                  : "pwc"
	card                    : "Philips 730 webcam"
	bus_info                : "usb-bcm2708_usb-1.2"
	version                 : 3.2.27
	capabilities            : 0x5000001 [VIDEO_CAPTURE,READWRITE,STREAMING]

pi@raspberrypi ~ $ v4l-info /dev/video0

### v4l2 device info [/dev/video0] ###
general info
    VIDIOC_QUERYCAP
	driver                  : "uvcvideo"
	card                    : "VF0530 Live! Cam Chat IM"
	bus_info                : "usb-bcm2708_usb-1.3"
	version                 : 3.2.27
	capabilities            : 0x4000001 [VIDEO_CAPTURE,STREAMING]

On note au passage le bus "BCM2708" : on est bien sur la Raspberry Pi, car la puce SoC Broadcom BCM2708 est le support de la puce CPU Broadcom BCM2835 qui équipe la carte.

Bon, pour la Philips, qui a déjà près de 10 ans, on reconnait le driver "pwc" spécialiste à ce constructeur.

Oh oh, ça sonne par contre plutôt bien pour la Creative, puisque la driver est "uvcvideo", c’est l’un des plus récents et des plus complets pour Linux. la capture vidéo et le streaming sont des capacités reconnues de ce modèle.

Il faut encore déterminer le type de format vidéo supporté. L’idéal serait le MJPEG (motion JPEG) à ne pas confondre avec le Mpeg des DVD et des DivX.

C’est de nouveau v4l2-ctl et ses nombreuses options qui nous renseigne :

pi@raspberrypi ~/webcams $ v4l2-ctl -d /dev/video0 --list-formats
ioctl: VIDIOC_ENUM_FMT
	Index       : 0
	Type        : Video Capture
	Pixel Format: 'YUYV'
	Name        : YUV 4:2:2 (YUYV)

pi@raspberrypi ~/webcams $ v4l2-ctl -d /dev/video1 --list-formats
ioctl: VIDIOC_ENUM_FMT
	Index       : 0
	Type        : Video Capture
	Pixel Format: 'PWC2' (compressed)
	Name        : Raw Philips Webcam

	Index       : 1
	Type        : Video Capture
	Pixel Format: 'YU12'
	Name        : 4:2:0, planar, Y-Cb-Cr

Pas de MJPEG mais du YUYV sur la première et du PWC2 (Philips propriétaire) et du YU12.

On installe encore deux autres outils pour s’assurer de la qualité d’image :

 luvcview qui permet de regarder le flux vidéo (connectez-vous avec un serveur X si vous n’avez pas d’écran connecté à la Rpi).
 uvccapture qui permet de prendre une photo

Ils ne fonctionnent qu’avec les formats MJPEG, YUYV et UYV... donc la Philips n’a pas fonctionné !

Installation

Si vous avez passé les étapes ci-dessus, vous pourrez y revenir si votre caméra ne fonctionne pas à la fin de l’installation suivante.

Tout d’abord on récupère les sources. Si vous êtes un développeur régulier sur Raspberry (ou que vous souhaitez le devenir) vous pouvez installer Subversion, le logiciel de partage de sources puis récupérer le logiciel mjpg-streamer (révision 167 à l’heure d’écrire ces lignes) :

pi@raspberrypi ~ $ sudo apt-get install subversion
pi@raspberrypi ~ $ mkdir webcams
pi@raspberrypi ~ $ cd webcams
pi@raspberrypi ~/webcams $ svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer

On vous la fait courte : mjpg-streamer a des dépendances nécessaires pour la compilation. Wolf Paulus a bien expliqué toutes ces étapes dans cet article de manière claire, bravo et merci à lui !

pi@raspberrypi ~/webcams $ sudo apt-get install libjpeg8-dev
pi@raspberrypi ~/webcams $ sudo apt-get install imagemagick

En observant la liste de tous les paquets installés, on se rend compte de l’énorme travail effectué par la communauté pour porter chaque projet sur les derniers matériels et les dernières distributions (ici, armhf).

Une fois la minute d’émotion passée (et après avoir envoyé un don de soutien à une association méritante dans la culture informatique...), on peut reprendre le cours de l’installation :

pi@raspberrypi ~/webcams $ cd mjpg-streamer/mjpg-streamer
pi@raspberrypi ~/webcams/mjpg-streamer/mjpg-streamer $ make
...

Une fois la compilation terminée, on lance le programme en lui passant diverses options, sur l’entrée (input) ou la sortie (output). En entrée, il faut dire qu’on ne peut utiliser que 320x240 sur cette caméra (testé avec luvcview) et qu’il faut le format YUYV. En sortie, on peut indiquer un port spécifique pour la liaison Internet, et préciser un login/mot de passe.

./mjpg_streamer -i "./input_uvc.so -y -r 320x240" -o "./output_http.so -w ./www"

C’est très très faible, mais ça vient de la webcam.

Pour tester, on se connecte depuis un navigateur du même réseau ou sur Internet une fois qu’on a configuré son boîtier ADSL pour que le port - 8080 par défaut - aille sur l’IP de sa Raspberry Pi.

Par exemple : http://192.168.0.15:8080/stream.html ce qui donne :

Et bien sûr on peut facilement modifier le contenu de la page, ou bien appeler le flux vidéo depuis une autre page d’un autre site.


[1Non Disclosure Agreement : accord de non-divulgation publique

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.