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.
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:
Model | Interface | Driver | Info |
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.