Laserspotcam

Qu'est-ce que c'est?

Laserspotcam est un petit programme que j'ai écris pour pouvoir contrôler xmms en pointant des endroits prédéfinis sur le mur avec un petit pointeur laser.

À l'aide d'une webcam, le logiciel surveille le mur continuellement pour la présence du point rouge. Lorsque le point rouge apparait à un des endroits prédéfinis, la commande appropriée est exécutée.


Images

Images par moi:
J'ai dessiné les symboles habituels pour Reculer, Arrêter, Jouer et Avancer sur quatre feuilles de papier avec des crayons à encre fluo.
Depuis la version 0.2, il y a aussi une barre de volume invisible en bas des boutons.
Avec un éclairage ultraviolet, les feuilles sont faciles à voir.
Ici je vise le "bouton" Jouer. Un court instant après, la musique s'est mise à jouer. Voici à quoi ressemble la fenêtre de laserspotcam. Les rectangles rouges démontrent les zones définies. Ici, le pointeur est dans la zone Jouer.
Cette fois le pointeur est à l'extérieur.

Images par Brian Dahlem:
Brian a imprimé une télécommande pour sa machine MythTV sur une feuille de papier de 61 cm par 61 cm. Voici la feuille vue par la webcam. Il utilse beaucoup plus de zones que moi!

Si vous voulez me montrer votre installation, contactez moi. Si c'est vraiment "cool", je vais poster les images dans cette section, avec votre permission bien sur ;)


Code source

Laserspotcam est conçu pour fonctionner sous Linux. l'API video4linux et sdl sont utilisés. La license GPL s'applique à tout le code source.
FichierDateCommentaires
laserspotcam-0.3.tar.gz 25 Septembre 2005 Inclusion d'un patch fait par Brian Dahlem:
  • Nouveau type de zone (bas à haut) pour les barres de volume verticales.
  • Zones à répétitons. Le format du fichier de configuration est légèrement modifié pour accomoder cette option
  • Avec les zones "gauche à droite", la valeur n'était pas passé en argument à la commande correctement. (Mais en mode verbose elle s'affichait correctement... Oops!)
laserspotcam-0.2.tar.gz 20 Septembre 2005
  • Nouveau type de zone (gauche à droite) pour l'implementation de barres de volumes
  • Nouvelle option -t, pour le mode test (commandes non exécutés)
  • Les zones apparaissent en vert lorsqu'elles sont activés.
laserspotcam-0.1.tar.gz 18 Septembre 2005 Première version



Caméra supportées

Voici une liste des caméras et/ou périphériques de capture vidéo ayant étés testés avec laserspotcam:
ModelInterfaceDriverInfo
Philips PWC 740 USB pwc Fonctionne très bien. Je vous suggère d'ajuster l'AGC avec SDLcam ou camstream pour éviter la saturation en pleine lumière.
Logitech QuickCam Express USB Spca5xx Fonctionne.
Logitech QuickCam Notebook Pro USB pwc Fonctionne.
Écrivez moi si vous avez une caméra qui fonctionne ou qui ne fonctionne pas. Si votre caméra ne fonctionne pas, je vais m'arranger pour corriger cela.


Installation

1: Compilation
Il vous faut la librairie sdl. Pour compiler laserspotcam, tapez 'make'.

2: Démarrer laserspotcam
Dans le répertoire où vous avez compilé laserspotcam, tapez:
# ./laserspotcam
Par défaut, /dev/video0 est utilisé. Si vous voulez utiliser une autre source vidéo, servez vous de l'option -d. Exemple:
# ./laserspotcam -d /dev/video1
Laserspotcam devrait ouvrir une fenêtre affichant les images provenant de la caméra.

3: Déterminer les coordonnés des zones
Vous avez peut-être dessiné des boutons sur le mur, ou collé des feuilles de papier colorés, ou encore...
Bon. Commencez par aligner votre caméra pour qu'elle voit tout les zones que vous voulez utiliser.

Maintenant, notez les coordonnés de toutes les zones rectangulaires que vous avez en cliquant sur le coin supérieur gauche dabord, et ensuite sur le coin inférieur droit de la même zone. Comme vous remarquerez, à chaque clique dans la fenêtre, les coordonnés du clique sont donnés dans la console.

4: Création du fichier de configuration
Le format du fichier de configuration est simple. Chaque définission de zone occupe une ligne, dans laquelle les valeurs sont séparés par des virgules. La premiè re valeur détermine le type de zone. Les types valides sont les suivants:
0: Zone normale. La commande est exécutée quand la zone se fait activer.
1: Zone de gauche à droite. La position du pointeur à l'intérieur de la zone se fait traduire de 0 à 100. Quand il est à gauche, c'est 0. À droite, c'est 100. Très utilse pour une barre de volume.
2: Zone de bas en haut. La position du pointeur à l'intérieur de la zone se fait traduire de 0 à 100. Quand il est en bas, c'est 0. En haut, c'est 100. Très utile pour une barre de volume.

La deuxième valeur est une booléenne. Si elles est à 0, la zone ne pourra pas être réactivé sans éteindre le pointeur (C'était toujours ainsi avant la version 0.3). Si sa valeur est 1, la zone sera réactivée aussi environ à chaque seconde aussi longtemps que le pointeur restera à l'intérieur de celle-ci.

Les deux valeurs suivantes correspondent au X et Y du coin supérieur gauche, les deux suivantes au X et Y du coin inférieur droit, et le reste de la ligne contient la commande shell à exécuter quand le pointeur laser entre dans cette zone. Voici un extrait de ma configuration:
0,0,174,111,242,164,xmms --play-pause
1,0,29,169,318,196,setmixer vol
0,1,0,0,50,50,echo -en "\\007"
Dans le premier des deux exemples, la position du coin supérieur gauche est 174,111, la position du coin inférieur droit est 242,164 et la commande qui est exécutée est "xmms --play-pause".

Le deuxième exemple implémente une barre de volume. La commande setmixer se fera rajouter une valeur de 0 à 100 comme argument. ex: "setmixer vol 55"

Le troisième exemple démontre la fonction répétission. Avec cet exemple, si laserspotcam ne tourne pas en arrière plan, vous devriez entendre des bip à chaque fois que la zone se fait activer.

5: Essais
Maintenant que vous avez un fichier de configuration, essayez le en le spécifiant via la ligne de commande. exemple:
# ./laserspotcam -vVr xmms.hs
Vous remplacerez bien sur xmms.hs par le nom de votre fichier de configuration. Rajoutez l'option -t si vous ne voulez pas que les commandes se fassent executer. Remarquez comment vos zones apparaissent par dessus l'image de la webcam maintenant. Lorsqu'un zone se fait activer, elle s'affiche en vert plutot qu'en rouge.

6: Démarrez laserspotcam en arrière plan et profitez-en!
# ./laserspotcam xmms.hs -b
L'option -b est responsable pour faire tourner l'application en arrière plan. Essayez -h pour plus d'options.


Algorithme utilisé

Le logiciel reçoit continuellement des images de la caméra. Tout d'abord, l'image est convertie en niveaux de gris. (en utilisant la luminance). Ensuite, la moyenne des 8 dernières images est soustraite de l'image courante, pour obtenir une nouvelle image contenant seulement les différences.

Dans cette nouvelle image, chaque pixel représente la valeur d'augmentation de luminosité par rapport à la moyenne. Plus l'augmentation est grande, plus la couleur du pixel se rapproche du blanc (255). Il y a en général des petits changements répartis sur la surface complète de l'image à cause du bruit.

Pour détecter la position du pointeur laser, il faut tenir compte des changements suffisamment grands. La valeur de chaque pixel est vérifiée. Si elle dépasse un certain niveau, le pixel se fait assigner la valeur 255. Si elle est inférieure au même niveau, le pixel se fait assigner la valeur 0. Après cette opération, l'image est en noir et blanc, et ne contient plus de bruit.

Maintenant qu'on a une image facile à interprèter, il faut calculer le rectangle contenant tout les changements. Puisque le laser produit un petit cercle de changement, la taille du rectangle est vérifiée:
  • Si la taille est trop grande, il est ignoré.
  • Si la taille est très grande, laserspotcam supposera qu'il s'agit de changements dû à une lumière qu'on viens d'allumer. Pour éviter que cela déclenche une commande par erreur, les 8 prochaines images (configurable) seront ignorés, ce qui permettra à la caméra de s'ajuster et à la moyenne des 8 dernières images de se refaire.
  • Si la taille est raisonnable, la liste des zones définies sera parcourue à la recherche d'une zone pouvant contenir le rectangle de changements. (voir plus bas, c'est un peu plus compliqué que ca)

Anti-répétitions
Pour éviter qu'une même commande soit executé plus qu'une fois à cause qu'on a laissé le pointeur trop longtemps dans la même zone, les stratégies suivantes sont utilisés:
  • Une fois qu'une zone a été activée, les images suivantes qui contiennent des changements (valides pour une zone ou pas) sont ignorés jusqu'a ce qu'une image sans changements (pas de pointeur) soit reçue. (Note: S'applique seulement aux zones non-répétables)
  • Quand une zone se fait activer, le moment (heure/seconde/milliseconde) est mémorisé. La zone est désactivée pendant une seconde.

Pourquoi la moyenne de 8 images?
Cela permet de comparer les images qui arrive à une base plus stable, car cela éllimine les changements de courte durée (il faut 8 images pour qu'un nouvel objet apparaisse parfaitement). Cela permettra aussi dans le futur d'avoir des zones qui s'activent seulement après que le pointeur soit resté pendant un nombre minimum d'images. Sans la moyenne de 8 images, le pointeur ne serait pas détecté à la deuxième image car il n'y aurait plus de différences.