Bien qu’encore populaire, Video For Linux 1 a fait place à V4L2 il y a bien longtemps alors que le développement de Linux en était à la version 2.5. S’il existe un obstacle à l’adoption de la nouvelle API chez les développeurs, c’est peut-être en raison de sa complexité. Certes il existe une documentation officielle qui détaile le fonctionnement de chacune des fonctions mais celle-ci aide peu à saisir l’idée générale d’interaction entre elles.
Heureusement, il nous est fourni le fichier capture.c qui fait office d’exemple d’implantation. Le code est bien organisé et peut être utilisé presque sur-le-champs dans n’importe quelle application. Toutefois, un peu de travail reste à faire pour mieux l’intégrer dans une application plus complexe.
Le code suivant a été réalisé lors de notre participation à Eurobot 2008 et visait à obtenir un code simple qui permettrait d’expérimenter et de déployer rapidement des solutions de traitement d’image.
Prenez note que, bien que fonctionnel, ce code n’a pas la flexibilité requise pour fonctionner avec n’importe quel type de matériel. Nous utilisions la caméra Quickcam pro 4000 de Logitech à cette occasion et vous retrouverez quelques valeurs codées "en dur" parmis les lignes.
Survol des fonctions
La classe VideoInput peut être initialisée de deux manières. Par exemple :
Crée un objeet VideoInput nommé "vdo" qui tentera d’accéder au périphérique V4L2 situé en "/dev/video0" avec comme valeurs par défaut : largeur = 320, hauteur = 240 et format de couleur YU12 (fourcc).
Ce premier constructeur est équivalent au second appelé de cette manière :
Pour saisir une image, il suffit seulement d’appeler la fonction "grab" :
Aucune valeur n’est retournée par cette fonction, mais une image est placée dans le buffer à ce moment. Celui-ci peut être obtenu par :
Prenez note que, par défaut, chaque appel à la fonction grab() fait aussi appel à une fonction de conversion YUV420p vers RGB "standard". Pour changer cette opération, il faudra adapter la fonction (privée) "ReadFrame".
Il était envisagé de faire fournir un mécanisme de conversion automatique "de" et "vers" n’importe quel format d’image. Toutefois, la tâche étant colossale, le projet n’a pas été entamé au sein de code. Une fonctionnalité de la sorte serait la pièce manquante pour entâmer le développement d’une librarie dédiée à la capture d’images pour nos robots. Le temps se faisant précieux, les prioritées étant ailleurs, ceci ne verra pas le jours prochainement... Une librairie simple, peu encombrante et flexible, est peut-être ce qui manque le plus actuellement. Libwebcam (libre), apparue récemment des laboratoires de Logitech, pourrait répondre à ce besoin mais elle offre seulement des fonctionalités UVC.
Si vous voulez supporter V4L1 dans votre application, Libfg est probablement ce qui se rapproche le plus de ces objectifs et devrait servir de modèle d’inspiration dans un projet du genre. Et pourquoi pas porter libfg à V4L2 ? Des volontaires ?
Documents joints
-
Classe VideoInput (BZip - 4.5 ko)Aucune instruction particulière pour la compilation.


Répondre à l'auteur: