% -------------------------------------------------------------------- % nouveau juillet 2014 à mixart-myrys % -------------------------------------------------------------------- \chapter{Webcam} \label{chap:webcam} \index{webcam} Sous Linux, c'est quand même un peu tordu% \footnote{Avis personnel !}, dans le même genre que la pile son, quoi... Nous allonc commencer par les principes et outils de base, puis passer à plus simple : juste tenter de prendre une photo avec une \textsl{webcam} classique en USB, et d'enregistrer cette image. % -------------------------------------------------------------------- \section{v4l2}\index{v4l2} \textsl{Video For Linux, second edition.} \begin{verbatim} tth@delirium:~$ v4l2-ctl --list-formats-ext ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: 'MJPG' (Motion-JPEG, compressed) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 320x240 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 1920x1080 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.033s (30.000 fps) \end{verbatim} Question : quelle méthode utiliser pour avoir la même chose avec des lignes de code écrites en C ? Il faut certainement passer par une suite d'appels \texttt{ioctl}\index{ioctl} après ouverture du device, mais la documentation est difficile à \textsl{greper}. % -------------------------------------------------------------------- \section{GameBoy camera} % % trouvé dans pleroma % Voilà (désolé dur de faire moins technique en 500 charactères): \texttt{sudo modprobe v4l2loopback exclusive\_caps\=1 video\_nr\=7 % card\_label="WebcamVirtuelle"} On créé un périphérique de caméra virtuelle sur /dev/video7 \texttt{ffmpeg -video\_size 352x288 -i /dev/video0 -i ./palette.png -lavfi fps=10,scale=w=128:h=112,paletteuse=dither=bayer,format=yuyv422 -f v4l2 /dev/video7} On fait une chaîne ffmpeg de la webcam réelle vers la virtuelle, en redimensionnant en 128x112 1/2 puis en appliquant un algorithme de dithering et une palette de couleurs (juste un PNG carré avec les différentes couleurs à utiliser pour le dithering, je peux le fournir si besoin). Enfin on force un format pour la webcam de destination et on sort sur son fichier (/dev/video7 comme défini tout à l'heure). C'est pas propre (et il faudrait que je change d'algorithme pour le scaling parce qu'il y a un effet de flou désagréable), MAIS ça fonctionne et le rendu ressemble. % -------------------------------------------------------------------- \section{vgrabbj} \index{vgrabbj} D'après la manpage : « \textit{ vgrabbj is a program that will grab images from any v4l-capable device which supports one of the rgb24, rgb32, yuv420, yuv420p, yuyv, or yuv422 palettes and saves the image as a .jpg, .png, or .pnm file. } » Quelques options à connaitre : \texttt{-S} échange des deux composantes R et B; \texttt{-s } affiche les capacités du périphérique v4l\index{v4l}. % -------------------------------------------------------------------- \section{Cheese} \begin{quote} cheese uses your webcam to take photos and videos, applies fancy special effects and lets you share the fun with others. It was written as part of Google's 2007 Summer of Code lead by daniel g. siegel and mentored by Raphaël Slinckx. Under the hood, Cheese uses GStreamer to apply fancy effects to photos and videos. With Cheese it is easy to take photos of you, your friends, pets or whatever you want and share them with others. After the success of the Summer of Code, the development continued and we are still looking for people with nice ideas and patches ;) \end{quote} % -------------------------------------------------------------------- \section{Kinect} \index{Kinect} Bon, voilà un nouveau gadget ;) À priori, la partie caméra RGB est gérée classiquement par v4l2, mais le coté spécifique, je ne sais pas qu'en faire... % --------------------------------------------------------------------