IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Traquage oculaire ?


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut Traquage oculaire ?
    Bonjour à tous !

    Je suis en train de me lancer dans la programmation d'un traqueur oculaire ayant pour but de pouvoir placer sur l'écran un curseur/pointeur à l'endroit regardé par l'utilisateur (ou tout du moins d'en retenir une trace).

    Je souhaiterai évidemment que ma solution coûte le moins cher possible aussi bien au niveau logiciel (d'où le choix OpenCV) que matériel (j'ai une vieille logitech pourrie, mais je peux envisager d'acheter quelque chose de mieux et/ou de bidouiller). Il va aussi de soi que je compte faire du temps réel

    A ce titre je me demandais si certains d'entre vous s'étaient déjà lancé dans ce genre de développement et sauraient répondre aux questions suivantes :
    - quel matériel vaut-il mieux choisir (camera montée sur lunette (+ frontal), webcam, ...) ?
    - quel(s) algorithme(s) et méthode(s) utiliser (s'ils sont déjà implémentés dans OpenCV c'est encore mieux) ?
    - quels sont les pièges à éviter ? autres remarques ?

    Merci d'avance pour vos éclairages

  2. #2
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Par défaut
    @TheGzD : tu fais ton doctorat sur le sujet ?
    J'ai dû moi-même développer quelque chose de similaire à l'époque, dans mon DEA.

    Plusieurs techniques, tout en restant low-cost :
    - prendre une webcam, virer le filtre IR, et fonctionner avec des images en proches infrarouge. L'ITU GazeTracker (http://www.gazegroup.org/downloads/23-gazetracker, avec support de la part du COGAIN, etc...) fonctionne très bien dans ce cas. Par contre, tu devras désolidariser l'objectif/la CM de la webcam, pour la monter sur un support type lunettes, et ajouter une diode infrarouge. Sur ebay, tu peux trouver des webcam avec diodes infrarouges prémontées (matériel chinois), bien suffisant pour ça. Il faudra juste forcer les LEDs IR à rester allumées en scotchant un bout de papier opaque sur le détecteur de luminosité. C'est le plus efficace, mais aussi le plus contraignant (il faut porter les lunettes en continu). L'avantage : image de grande taille, de qualité (pas de problèmes de luminosité), pas de parallaxe quand le visage bouge.
    - si tu veux garder une webcam en lumière visible classique, c'est plus compliqué. Soit tu travailles toujours avec une webcam montée sur des lunettes (plus facile), ou tu travailles avec une webcam montée au-dessus de l'écran de l'utilisateur (plus compliqué).
    En effet, il te faut obtenir l'image de l'iris (pour savoir où l'utilisateur regarde), mais aussi la position de la tête en 3D, pour compenser les effets de parallaxe par rapport à l'image de l'oeil (tu as donc une composition de translations, réductions, homothéties, etc...)
    Obtenir la position de la tête dans l'espace est compliqué. Il existe des frameworks tout fait (mais pas forcément libres/gratuits/open source) : FaceApi, face.com, etc...
    L'idée reste toujours la-même : estimer la déformation de ce ressemble à un visage dans l'image par rapport à une image de référence.
    J'avais utilisé les AAM à l'époque, pour calculer la position de la tête (pitch, yaw, roll), afin d'avoir des degrés de déviation par rapport à un visage qui regarde de face (avec un peu de trigo).
    Moins complexe, mais moins robuste : calculer la position de 4 points sur le visage (minimum) qui ne sont pas coplanaires, afin d'utiliser un algorithme comme le POSIT : http://www.cfar.umd.edu/~daniel/Site_2/Code.html (on va considérer que la tête n'est pas un corps déformable ).
    Ainsi, tu as la position dans l'espace de la tête. Pour calculer ces 4 points, tu peux faire une recherche, avec cvTemplate d'OpenCV, par exemple, de la zone des narines ("2 points noirs sombres"), des 2 coins des yeux/sourcils, et d'un des coins de la bouche (soit 4 points). Cela ne va pas fonctionner, évidemment, si la tête ne dévie pas trop de l'axe principal.
    Pour la recherche de Template, les infos que j'ai donné dans un des fils précédents, pour quelqu'un qui veut aussi faire une recherche de l'oeil sont pratiques pour normaliser cette recherche (http://www.developpez.net/forums/d12...re-image-oeil/).
    Tu peux ainsi cherche le déplacement de l'iris sur le "plan" de l'oeil (la sclère est courbe, mais tu n'as pas trop les moyens, à cette résolution, de connaître ce rayon de courbure).

    Une fois connues le mouvement de la tête par rapport à la position centrale, et le mouvement de l'iris sur le plan de l'oeil, tu peux composer les deux, pour ramener le mouvement de l'oeil face à l'écran.

    Pour déplacer le curseur, il faut ensuite proposer une étape de calibration à l'utilisateur. Tu présentes une série de points dont la position est connue à l'avance, à l'écran (9 points, c'est une bonne base) : 1 dans chaque coin, et un au milieu de chaque axe.
    Tu vas ensuite demander à l'utilisateur de regarder chacun de ces points. Tu enregistre la position (x,y) du centre de l'iris que tu auras détecté.

    Tu peux alors construire 2 fonctions de mise en correspondance, une pour les x et une pour les y, qui réalise un mapping (non-linéaire, c'est plus précis dans ce cas précis que linéaire, mais c'est plus compliqué à construire) entre la position (x,y) de l'iris détectée, et la position (x,y) du curseur à l'écran (et là, un simple SetCursorPos() devrait t'aider).

    A cette étape, il te faudra ensuite un gros filtrage sur la position détectée pour annuler le jitter, qui sera très présent (rien qu'avec la différence de résolution entre ta webcam et ton écran, tu vas avoir des sauts importants).

    Je pense que ça peut te servir de bonne base . N'hésite pas à poser des questions si je n'ai pas été clair.
    C'est pour la rédaction d'un papier ?

  3. #3
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Salut Pseudopode et merci pour ta réponse !

    Citation Envoyé par Pseudopode Voir le message
    @TheGzD : tu fais ton doctorat sur le sujet ?
    J'ai dû moi-même développer quelque chose de similaire à l'époque, dans mon DEA.
    Non pas exactement sur ce sujet mais j'ai besoin de pouvoir faire, entre autre, l'acquisition de ce genre de données.
    Ces acquisitions requièrent d'être faites en parallèle et temps réel, donc j'exclue de facto les langages lents et à fortes dépendances tels que Java.

    Citation Envoyé par Pseudopode Voir le message
    Plusieurs techniques, tout en restant low-cost :
    - prendre une webcam, virer le filtre IR, et fonctionner avec des images en proches infrarouge. L'ITU GazeTracker (http://www.gazegroup.org/downloads/23-gazetracker, avec support de la part du COGAIN, etc...) fonctionne très bien dans ce cas. Par contre, tu devras désolidariser l'objectif/la CM de la webcam, pour la monter sur un support type lunettes, et ajouter une diode infrarouge. Sur ebay, tu peux trouver des webcam avec diodes infrarouges prémontées (matériel chinois), bien suffisant pour ça. Il faudra juste forcer les LEDs IR à rester allumées en scotchant un bout de papier opaque sur le détecteur de luminosité. C'est le plus efficace, mais aussi le plus contraignant (il faut porter les lunettes en continu). L'avantage : image de grande taille, de qualité (pas de problèmes de luminosité), pas de parallaxe quand le visage bouge.
    - si tu veux garder une webcam en lumière visible classique, c'est plus compliqué. Soit tu travailles toujours avec une webcam montée sur des lunettes (plus facile), ou tu travailles avec une webcam montée au-dessus de l'écran de l'utilisateur (plus compliqué).
    Ok je connaissais ITU GazeTracker, mais rien que sa licence fait que je ne peux pas l'utiliser. Par contre c'est globalement ce que je veux faire, sauf que je ne vois pas comment ça pourrait marcher avec 1 seule caméra : certes je connais la position de l'iris de l'utilisateur, mais on peut regarder un point sur un écran avec un grand nombre de positions de tête différentes et donc autant de positions d'iris différentes. Je présume donc qu'il faut soit rajouter un caméra frontale (et il faudra s'amuser à reconnaitre l'écran filmé par cette dernière ... c'est pas terrible mais ça peut marcher avec autre chose qu'un écran) soit une caméra montée sur l'écran pour repérer la position de la tête. La première caméra (IR de préférence) étant montée sur des lunettes, je pense que je peux très bien faire la reconnaissance de la tête de l'utilisateur en reconnaissant les lunettes (sur lesquelles des repaires peuvent être mis).

    Citation Envoyé par Pseudopode Voir le message
    En effet, il te faut obtenir l'image de l'iris (pour savoir où l'utilisateur regarde), mais aussi la position de la tête en 3D, pour compenser les effets de parallaxe par rapport à l'image de l'oeil (tu as donc une composition de translations, réductions, homothéties, etc...)
    Obtenir la position de la tête dans l'espace est compliqué. Il existe des frameworks tout fait (mais pas forcément libres/gratuits/open source) : FaceApi, face.com, etc...
    L'idée reste toujours la-même : estimer la déformation de ce ressemble à un visage dans l'image par rapport à une image de référence.
    J'avais utilisé les AAM à l'époque, pour calculer la position de la tête (pitch, yaw, roll), afin d'avoir des degrés de déviation par rapport à un visage qui regarde de face (avec un peu de trigo).
    Moins complexe, mais moins robuste : calculer la position de 4 points sur le visage (minimum) qui ne sont pas coplanaires, afin d'utiliser un algorithme comme le POSIT : http://www.cfar.umd.edu/~daniel/Site_2/Code.html (on va considérer que la tête n'est pas un corps déformable ).
    Ainsi, tu as la position dans l'espace de la tête. Pour calculer ces 4 points, tu peux faire une recherche, avec cvTemplate d'OpenCV, par exemple, de la zone des narines ("2 points noirs sombres"), des 2 coins des yeux/sourcils, et d'un des coins de la bouche (soit 4 points). Cela ne va pas fonctionner, évidemment, si la tête ne dévie pas trop de l'axe principal.
    Pour la recherche de Template, les infos que j'ai donné dans un des fils précédents, pour quelqu'un qui veut aussi faire une recherche de l'oeil sont pratiques pour normaliser cette recherche (http://www.developpez.net/forums/d12...re-image-oeil/).
    Tu peux ainsi cherche le déplacement de l'iris sur le "plan" de l'oeil (la sclère est courbe, mais tu n'as pas trop les moyens, à cette résolution, de connaître ce rayon de courbure).

    Une fois connues le mouvement de la tête par rapport à la position centrale, et le mouvement de l'iris sur le plan de l'oeil, tu peux composer les deux, pour ramener le mouvement de l'oeil face à l'écran.

    Pour déplacer le curseur, il faut ensuite proposer une étape de calibration à l'utilisateur. Tu présentes une série de points dont la position est connue à l'avance, à l'écran (9 points, c'est une bonne base) : 1 dans chaque coin, et un au milieu de chaque axe.
    Tu vas ensuite demander à l'utilisateur de regarder chacun de ces points. Tu enregistre la position (x,y) du centre de l'iris que tu auras détecté.

    Tu peux alors construire 2 fonctions de mise en correspondance, une pour les x et une pour les y, qui réalise un mapping (non-linéaire, c'est plus précis dans ce cas précis que linéaire, mais c'est plus compliqué à construire) entre la position (x,y) de l'iris détectée, et la position (x,y) du curseur à l'écran (et là, un simple SetCursorPos() devrait t'aider).

    A cette étape, il te faudra ensuite un gros filtrage sur la position détectée pour annuler le jitter, qui sera très présent (rien qu'avec la différence de résolution entre ta webcam et ton écran, tu vas avoir des sauts importants).
    Bon là y a un bon paquet de termes qui m'échappent
    Je pense comprends le fond mais n'y a-t-il dans OpenCV un moyen simple de faire tout ça ? Parce que là je dois t'avouer que si ce n'est pas le cas je me demande vraiment ce que fait l'API
    Après le choix d'OpenCV n'est peut-être pas le bon, je ne sais pas ...

    Niveau matériel et contraintes techniques je pense que tu m'as bien répondu, par contre niveau méthodes et algorithmes j'aimerai si possible des informations plus concrètes et surtout plus relatives à OpenCV si c'est possible comme par exemple les noms de méthodes. En effet leur doc est tellement mal faite que je ne m'en sors pas, tout est quasi faux, les chemins n'existent pas, il font référence à des fichiers de versions précédentes, ...

    En tout cas merci encore et à bientôt

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Par défaut
    @TheGzD : en fait tu ne vas pas trouver de lib facile à utiliser (ou même plus complète) pour faire du tracking oculaire pour le moment.

    Avec OpenCV, tu peux déjà tenter d'utiliser les fonctions proches de cvMatchTemplate() (même si la doc est incomplète, tu peux trouver des choses dans les dossier samples/).

    Le truc suivant à faire, une fois que tu as des templates (tu peux par exemple demander à l'utilisateur de cliquer sur 4 points de l'image du visage fournie par la webcam, et de prendre une image de 15x15 autour de ce point pour faire un template), tu peux tenter de faire un POSIT avec le centre de chacun de ces 4 templates, et ainsi avoir l'orintation de la tête.

  5. #5
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Merci pour ta réponse.
    Par contre tu me parles de choses, en l’occurrence la comparaison avec des templates, qui a mon sens relèvent déjà de la méthode choisie et je n'ai pas encore statué la dessus ni trouvé de véritable revue de la littérature ou autre état de l'art à ce sujet.
    De plus je n'ai pas l'impression que ce genre d'approche soit optimisée ni très fiable. Sans parler d'une calibration "manuel" avant chaque usage ... enfin c'est peut-être ce qu'on fait de mieux mais je n'en sais rien (voir plus haut ^^).

    Tout ça pour dire que j'aime bien savoir ce que je fais (et que c'est la bonne façon de faire) avant d'attaquer l'implémentation en tant que telle
    Aurais-tu des informations pour m'éclairer sur ces différents points ?
    Je continue bien sûr de chercher de mon côté.

    PS : après peut-être que le choix d'OpenCV n'est pas le bon ... mais il me semble qu'au contraire si la bibliothèque est assez bas niveau ça laisse plus de latitude quant à l'implémentation d'une méthode.

  6. #6
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Par défaut
    Déjà, avant de faire le choix logiciel, il faut faire un choix matériel. De quel budget disposes-tu ? Veux tu rester en lumière visible (moins cher mais moins stable) ou travailler en IR (plus robuste, mais plus cher) ?

    Edit : j'avais utilisé, en autres, le pdf à cette adresse : http://www2.imm.dtu.dk/pubdb/views/p...ls.php?id=3625
    Dans ton cas, la partie intéressante commence au Chapitre 12 (la Partie II). Tout ce qui est avant, c'est des AAM pour avoir la poste de la tête.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Traquage de couleur
    Par joladouille dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 22/06/2009, 09h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo