% -------------------------------------------------------------------- % 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.} % % PLEASE EXPLAIN ! % \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}. % -------------------------------------------------------------------- % nouveau : Tue Sep 3 11:14:13 UTC 2024 \section{libwebcam} \index{libwebcam} \begin{quote} The Webcam Library libwebcam is designed to simplify the development of webcam applications, primarily on Linux but with an option to be ported to other platforms, in particular Solaris. It realizes part of what the unwritten Video4Linux user space library was always supposed to be: an easy to use library that shields its users from many of the difficulties and problems of using the V4L2 API directly. \end{quote} % -------------------------------------------------------------------- % nouveau du Tue Sep 17 08:03:49 UTC 2024 \section{UVC} \index{UVC} \begin{quote} L'USB video device class (aussi appelé USB video class abrégé en UVC) est un protocole de gestion de périphériques électroniques vidéo via les ports de type USB\index{USB}. Il permet de gérer les flux vidéo dans différents encodages, les images fixes, ainsi que le contrôle des appareils qui le permettent. \end{quote} Le jour\footnote{Lundi 17 septembre 2024} même où je me penche sur cette techno, premier souci~: \textsl{Le pilote pour les WebCams UVC – standard utilisé pour les caméras USB modernes – n’est pas encore au point et n’est pas inclus dans les versions publiées de Haiku.} % -------------------------------------------------------------------- \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 (parfois utile avec des caméras \textit{noname}); \texttt{-s } affiche les capacités du périphérique v4l\index{v4l} que l'on sélectionne avec \texttt{-d /dev/vidz0}. Il y a plus de choses à dire, avec un exemple concret. XXX\index{XXX} % -------------------------------------------------------------------- \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... % --------------------------------------------------------------------