Accueil du site > Linux > Caméra IIDC IEEE 1394 sous Linux

Caméra IIDC IEEE 1394 sous Linux

jeudi 2 mars 2006, par Pierre-Luc Bacon

Mes précédentes expérimentations en traitement d’images avaient été réalisées à l’aide d’une Quickam Express pour des raisons de compatibilité et de coût. L’étape de capture de l’image étant accomplie, l’avancement du projet vers l’analyse des images nécessitait alors une plus grande stabilité en ce qui a trait à adaptation à la lumière ainsi qu’à un meilleur rendement en couleur. Une caméra plus performante, suivant le protocole IIDC 1394 a été retenue...

JPEG - 6.8 ko
iSight
La caméra d’Apple ieee1394 compatibles aux spécifications IIDC ou DCAM

Pour le développeur/expérimentateur non subventionné, la première idée se présentant pour améliorer la qualité de l’image est d’utiliser une caméra analogique du type caméra de surveillance après avoir choisi de délaisser sa webcam. En effet, il serait possible de convertir ce signal par l’entremise d’une carte TV des familles de puces bttv, saa7134 ou cx88. Même si bon nombre de ces cartes soit supporté sous Linux, une contrainte se présente par cette solution : celle du phénomène d’entrelacement. Comme la plupart des caméras analogiques d’entrée de gamme procèdent à un entrelacement du balayage, un décalage temporel à l’intérieur de l’image vient s’ajouter ; tantôt les lignes paires sont acquises dans un premier balayage à un instant donné, et celles paires à l’instant plus tard. Une moitié de l’image est donc fixée à un instant t et l’autre à t+1, ce qui n’est pas appréciable pour une opération telle que le calcul du flux optique (« optical flow »). À moins d’utiliser de l’équipement spécialisé fort onéreux, cette idée n’est pas préférable.

Plusieurs solutions commerciales peuvent également s’offrir pour l’acquisition vidéo en temps réel allant de la solution propriétaire à quelques centaines de dollars jusqu’à celles à quelques milliers. Bien heureusement, la licence et les billets verts ne font pas tout ce monde : l’initiative libre existe aussi. La solution retenue pour les besoins du projet consiste en l’utilisation d’une caméra firewire compatible avec les spécifications du standard IIDC, aussi reconnu sous l’acronyme DCAM. Puisque ce type de matériel implémente une méthode commune de capture et d’accès à la caméra, nul besoin de disposer d’un pilote spécifique pour chaque modèle. Ainsi, toute caméra de type IIDC (ou DCAM) est supportée sous Linux grâce aux initiatives libdc1394, libraw1394 et surtout Coriander.

La norme IIDC, pour « Instrumentation & Industrial Digital Camera », permet de réaliser à la fois des opérations de contrôle des paramètres de la caméra mais aussi de définir précisément le transfère des images. Le standard étendra donc le contrôle sur la caméra à des ajustements de la luminosité, de la balance des blancs, du temps d’exposition, du focus, de la température et autre...

L’implantation d’un tel protocole étant une tâche d’une envergure considérable, une solution plus directe sera appréciée (convenable à tout le moins en phase de recherche et développement). L’idée consistera donc à utiliser le logiciel Coriander de Damien Douxchamps, développé sous GNU/GPL pour Linux. Coriander est une GUI permettant le contrôle de toute caméra ieee1394 suivant la norme IIDC. Parmi ses nombreuses fonctionnalités, l’une d’entre nous intéressera plus que tout : celle d’avoir la possibilité de créer un dispositif V4L accessible par tout programme de manière habituelle en /dev/videox par exemple. Par cette fonctionnalité, nous serons donc en mesure d’utiliser directement cette caméra firewire comme si nous avions affaire à un dispositif de capture Video For Linux dans un programme développé initialement pour une caméra usb [1].

La caméra...

La caméra choisie est la iSight d’Apple. Celle-ci présente l’avantage de suivre la norme DCAM et donc d’être utilisable sous Linux avec Coriander. Également, parmi toutes les caméras disponibles sur le marché du consommateur domestique (au côté des webcams pour chat et cie), la iSight est certainement celle offrant les meilleures performances. Son adaptation à la lumière est en effet remarquablement rapide, son rendu en couleur très naturel (particulièrement pour les tons de peau) et la résolution bien suffisante. Parmi ces fonctionnalités que l’on apprécie plus que tout, mentionnons le focus « 50mm à l’infini » automatique, contrôlable aussi manuellement.

Fiche technique :

F2.8
Autofocus 5mm-&infin
Champs de vision : 54,3°
Capteur CCD 1/4"
Résolution maximale de 640x480
30 images par seconde

Malgré son prix quelque peu élevé pouvant atteindre 150$, la iSight est une caméra abordable avant l’achat de matériel professionnel [2].

Installation

Comme pour toute installation à partir des sources sous Linux, la compilation d’un programme est toujours facile : il suffit dans la plupart des cas d’exécuter l’enchaînement « ./configure && make && sudo make install ». Cependant, la pratique nous apprend que la réalité est tout autre. Il est nécessaire en effet dans bien des cas de résoudre les liens de dépendances qui mènent a un processus beaucoup plus long. Comme Coriander intègre beaucoup de fonctionnalités codées au sein d’autres projets, le processus d’installation ici décrit ne se fera pas d’un seul claquement de doigts.

Récupérez donc d’abord les sources du programme Coriander sur cette page : http://damien.douxchamps.net/ieee1394/coriander/

Assurez-vous ensuite que les programmes listés ci-dessous soient installés sur votre système ou procédez à leur installation à votre manière [3] :

 libraw1394
 libdc1394
 ffmpeg
 ftplib [4]
 SDL

Si vous êtes toujours sous le kernel 2.4, il est recommandé que vous passiez au 2.6, ou à tout le moins, vérifiez qu’il soit compatible firewire 1394 (>2.4.23). Ce point devient plus important pour ce qui suit : si vous souhaitez que Coriander puisse rediriger les images saisies sur un dispositif virtuel V4L, il vous faudra le support vloopback. Comme les dernières versions de vloopback sont destinées aux kernels supérieurs au 2.6.8, il est tout à votre avantage d’effectuer ce changement.

Le processus d’installation de vloopback est quelque peu différent. Saisissez d’abord cette version et une fois décompressé (tar xzf), il suffit d’exécuter « make » suivit de « sudo make install ». Pour charger le module, il faudra ensuite procéder à l’aide de la commande « modprobe » [5].

Si toute cette liste est effectivement installée sur votre système, vous pouvez alors procéder à la compilation de Coriander. Cependant, vous noterez possiblement une erreur liée à l’absence de ffmpeg. Or, vous qui sachez pertinemment que ffmpeg est bel et bien installé, devrez recourir à un tour de passe-passe. En effet, il semble que les développeurs de Coriander aient pris pour acquis qu’un script appelé « ffmpeg-config » soit présent sur toutes les distributions (faites locate « ffmpeg-config » pour en avoir le coeur net). Cependant, cette présomption tenait lieu sous un système comme Debian qui possède des paquetages précompilés avec ffmpeg-config mais ne s’appliquait pas dans le cas où les binaires de ffmpeg provenaient directement des sources (CVS).

Une solution à ce problème serait d’adapter soi-même un script ffmpeg-config [6] :

Placez-le ensuite dans /usr/bin et rendez-le exécutable : « chmod +x ffmpeg-config ».

Coriander devrait maintenant pouvoir compiler le support ffmpeg.

Utilisation

Si vous comptez user des fonctions vloopback de Coriander, vous devrez vérifier si le module vloopback est chargé (lsmod). Pour procéder à son chargement manuel, nous effectuerons :

#modprobe vloopback pipes=n

où « n » correspondra aux nombres de dispositifs vloopback souhaités (entre 1 et 16)

Avant de procéder avec cette commande, vérifiez d’abord le nombre de fichiers spéciaux V4L disponibles :

Puisque vloopback dirigera le flux vidéo sur un premier fichier (disons video0) et que sa sortie sera récupérable sur fichier+1 (video1), alors il vous faudra peut-être alors en ajouter quelques-uns.

Et ainsi de suite pour tous les autres fichiers à créer.

Vous pouvez dès lors lancer Coriander.

PNG - 28.5 ko

Dans cette première fenêtre qui apparaîtra, si votre caméra est branchée, que les modules sont chargés et que vous avez les droits appropriés sur les fichiers [7], votre caméra devra figurer dans la liste du menu déroulant.

Pour démarrer la communication avec la caméra, appuyer sur « start » et rendez-vous dans l’onglet « services ». Cliquer finalement sur les boutons « receive », « display » et « V4L » pour démarrer la transmission, ouvrir une fenêtre d’affichage et procéder à la communication V4L.

PNG - 194.8 ko

Les paramètres de la caméra devraient aussi être contrôlables par l’entremise des options de l’onglet « features ».

PNG - 23.9 ko

Pour éviter des erreurs de communication lors des prochaines opérations, n’oubliez pas de terminer vos opérations en appuyant sur le bouton « stop ».

Pour ce qui en est de la caractéristique qui nous importe le plus, soit la possibilité de produire un flux vidéo compatible V4L, celle-ci devrait fonctionner correctement si vous avez suivi les étapes décrites ci-haut (et que le hasard en ait pas fait des siennes). Sinon, vérifiez que le module vloopback soit bien chargé, et que vous ayez les droits d’accès sur les fichiers en /dev/video*.

Cette fonctionnalité peut être testée à l’aide du programme Effectv qui, comme son nom l’indique, produit des effets vidéo et a la capacité de produire lui aussi un flux vloopback en sortie. Ceci permet de réaliser des enchaînements d’effets comme nous le montre cette copie d’écran :

PNG - 538.7 ko
effectv -device /dev/video1 -vloopback /dev/video2
effectv -device /dev/video3 -vloopback /dev/video3

Il devrait être dorénavant possible d’utiliser toute caméra IIDC dans un programme compatible V4L. Par sa grande modularité, il est envisageable par la suite d’user des bibliothèques utilisées par Coriander pour implanter soi-même le protocole dans son application. Avant d’y arriver, Coriander est certes d’une aide précieuse dans le développement d’une application de traitement vidéo sous Linux.

Portfolio

Notes

[1] Notez que les caméras USB n’intègrent pas le standard IIDC. Seul des solutions propriétaires sont disponibles pour des fins semblables.

[2] Voir les produits d’Imaging source

[3] Aucune recommandation particulière n’est donnée ici si ce n’est qu’étant sous Slackware, il est préférable de procéder en spécifiant certaines options à ./configure telles que ./configure —prefix=/usr —localstatedir=/var —syconfdir=/etc. Vous pouvez également optimiser le moindrement votre code avec l’option CFLAG="i686 -02" si cette architecture vous convient.

[4] Pour que Coriander découvre la libftp, vous devrez exécuter « sudo ldconfig » après avoir fait « make install » dans le répertioire de ftplib. Si vous redémarrer votre ordinateur, ldconfig devrait être exécuté également.

[5] Voir plus loin dans l’article pour quelques détails

[6] Il a été aussi proposé sur la mailing-list de Coriander la solution suivante. Créer un script dans /usr/local/bin ou /usr/bin/ contenant ces quelques lignes et rendez-le exécutable.
# !/bin/sh
echo -lavformat -lavcodec -I/usr/include/ffmpeg

[7] Il peut être nécessaire d’effectuer « chmod 666 /dev/raw1394 » auparavant.

Enregistrer au format PDF
Marquer cet article: Delicious Technorati

Répondre à cet articleRépondre à l'auteur:Pierre-Luc BaconRecommander à un ami

2 Messages de forum