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).
Partager