Test de la caméra Raspberry Pi 5M
Date: 27/05/2013 | Catégories: Hardware,Open-source,Planet-libre,raspberry | Tags: 5M,camera
Raspberry propose depuis peu et pour moins de 25€ une caméra dédiée à sa gamme Pi. Cette caméra de quelques grammes se connecte à une Raspberry Pi (model A ou B) à travers une interface CSi v2 (MIPI camera interface) dédiée. Grâce à Kubii (fournisseur Farnell en France) j'ai pu obtenir rapidement un de ces caméra que nous allons tester dans ce billet.
Découverte de la (petite) bête
Avec un capteur d'une résolution native de 5 mégapixels (5M) et au niveau optique d'une lentille de focalisation fixe, la caméra peut servir d'appareil photo (résolution maximale de 2592 par 1944 pixels) ou de caméra vidéo (format HD juqu'à 1080p). Son poids est impressionnant car elle ne pèse pas plus de 4 grammes pour une dimension de L25 l20 H9 (en millimètre).
Installation de la caméra
On commence par brancher la caméra sur l'interface CSi. Il faut y aller doucement, sans forcer comme un bourrin. Je vous conseille de visualiser la vidéo suivante:
Il faut disposer d'une distribution Raspbian à jour avant de pouvoir activer la caméra:
sudo apt-get update && sudo apt-get upgrade
Puis on lance ensuite l'utilitaire raspi-config ou un nouveau menu devrait vous permettre d'activer la caméra (choix numéro 5 - Activate the camera):
sudo raspi-config
Un reboot plus tard vous pouvez commencer à jouer avec la caméra
Utilisation de la caméra pour prendre des photos
Première surprise un peu désagréable: la caméra n'est pas reconnue comme un device vidéo standard (accessible via /dev/videoX). En l'état actuel des choses on ne peut donc pas l'utiliser avec une bibliothèque comme GStreamer.
Pour utiliser la caméra comme appareil photo, il faut donc passer par un utilitaire installé de base dans Raspbian: Raspistill (les sources sont disponibles sur Github).
Ce logiciel est utilisable en ligne de commande.
Prenons donc notre première "photo" en résolution maximale et à main levé (2592 par 1944 pixels):
raspistill -o image001.jpg
La même photo avec l'option de stabilisation activée (pas de grosse différence mais je ne bougeais pas):
raspistill -ev -o image002.jpg
Il est possible de désactiver la compression JPEG en utilisant le tag --raw (mais attention la taille des images passes à plus de 5 Mo):
raspistill --raw -o image002.jpg
Voir le résultat ici.
Il est bien sûr possible de fixer la résolution avec les tag -h et -w. Par exemple une photo en 1280x1024:
raspistill -w 1280 -h 1024 -o image003.jpg
Utilisation de la caméra pour capturer des vidéo
Tout comme pour les photos, il faut passer par le l'utilitaire Raspivid (les sources sont disponibles sur Github). Le logiciel va permettre de générer des vidéos au format H.264.
Capturons notre première vidéo en full HD (1080p) pendant 10 secondes (-t 10000):
raspivid -t 10000 -o video001.h264
La vidéo est stocké au format H.264 dans le fichier video001.h264. Pour lire cette vidéo sur votre Raspberry, vous pouvez utiliser la commande omxplayer qui va utiliser le GPU interne et afficher la vidéo d'une manière fluide sans consommation CPU.
omxplayer video001.h264
On peut voir que la qualité du capteur est au rendez-vous, la vidéo est lumineuse et fluide, comparable à ce que l'on peut obtenir avec un bon smartphone.
Pour activer la prévisualisation de la vidéo dans un coin de l'écran (position 0x0 et taille de 640x480) on peut utiliser l'option -p:
raspivid -t 10000 -p 0,0,640,480 -o video0012.h264
Aller plus loin ?
La documentation officielle des deux commandes.
Raspistill
raspistill ========== --width, -w Set image width <size> --height, -h Set image height <size> --quality, -q Set jpeg quality <0 to 100> Quality 100 is almost completely uncompressed. 75 is a good all round value --raw, -r Add raw bayer data to jpeg metadata This option inserts the raw Bayer data from the camera in to the JPEG metadata --output -o Output filename <filename>. Specify the output filename. If not specified, no file is saved. If the filename is '-', then all output is sent to stdout. --verbose, -v Output verbose information during run Outputs debugging/information messages during the program run. --timeout, -t Time before takes picture and shuts down. The program will run for this length of time, then take the capture (if output is specified). If not specified, this is set to 5 seconds --timelapse,-tl Timelapse mode. The specific value is the time between shots in milliseconds. Note you should specify %d at the point in the filename where you want a frame count number to appear. e.g. -t 30000 -tl 2000 -o image%d.jpg will produce a capture every 2 seconds, over a total period of 30s, named image1.jpg, image2.jpg..image15.jpg. --thumb, -th Set thumbnail parameters (x:y:quality) Allows specification of the thumbnail image inserted in to the JPEG file. If not specified, defaults are a size of 64x48 at quality 35. --demo, d Run a demo mode <milliseconds> This options cycles through range of camera options, no capture is done, the demo will end at the end of the timeout period, irrespective of whether all the options have been cycled. The time between cycles should be specified as a millisecond value. --encoding, -e Encoding to use for output file Valid options are jpg, bmp, gif and png. Note that unaccelerated image types (gif, png, bmp) will take much longer to save than JPG which is hardware accelerated. Also note that the filename suffix is completely ignored when encoding a file. --exif, -x EXIF tag to apply to captures (format as 'key=value') Allows the insertion of specific exif tags in to the JPEG image. You can have up to 32 exif tge entries. This is useful for things like adding GPS metadata. For example, to set the Longitude --exif GPS.GPSLongitude=5/1,10/1,15/100 would set the Longitude to 5degs, 10 minutes, 15 seconds. See exif documentation for more details on the range of tags available; the supported tags are as follows.
Raspivid
raspivid ======== --width, -w Set image width <size> Width of resulting video. This should be between 64 and 1920. --height, -h Set image height <size> Height of resulting video. This should be between 64 and 1080. --bitrate, -b Set bitrate. Use bits per second, so 10MBits/s would be -b 10000000. For H264, 1080p a high quality bitrate would be 15Mbits/s or more. --output -o Output filename <filename>. Specify the output filename. If not specified, no file is saved. If the filename is '-', then all output is sent to stdout. --verbose, -v Output verbose information during run Outputs debugging/information messages during the program run. --timeout, -t Time before takes picture and shuts down. The program will run for this length of time, then take the capture (if output is specified). If not specified, this is set to 5seconds --demo, d Run a demo mode <milliseconds> This options cycles through range of camera options, no capture is done, the demo will end at the end of the timeout period, irrespective of whether all the options have been cycled. The time between cycles should be specified as a millisecond value. --framerate, -fps Specify the frames per second to record At present, the minimum frame rate allowed is 2fps, the maximum is 30fps. This is likely to change in the future. --penc, -e Display preview image *after* encoding Switch on an option to display the preview after compression. This will show any compression artefacts in the preview window. In normal operation, the preview will show the camera output prior to being compressed. This option is not guaranteed to work in future releases.
Conclusion
Pour moins de 60€, il est donc possible d'avoir un Raspberry Pi model B + Camera qui vous ouvre la porte à pas mal de possibilité. J'espère rapidement voir apparaître une API (en Python par exemple) permettant de programmer directement la caméra.
De mon coté je vais faire un peu mumuse avec ce nouveau jouet puis revenir prochainement vers vous pour de nouveaux billets sur le sujet !