8
votes

Estimation de la tête de la tête avec OpenCV, C ++ et image 2D - Méthode géométrique - rouleau, lacet et la hauteur

J'essaie de trouver les trois angles du visage d'une personne, basé sur une image 2D image 2D .

J'utilise OpenCV avec HAARCASCADE pour trouver le visage, les yeux, le nez et la bouche. Mais je n'ai trouvé aucune méthode géométrique qui peut m'aider à trouver les angles X, Y et Z (rouleau, pitch et yaw).

Quelqu'un pourrait-il m'aider à montrer une méthode en C ++ ou Java qui fonctionne?


1 commentaires

Ceci n'est pas une question C ++, donc j'ai supprimé cette balise.


3 Réponses :


5
votes

Étant donné une image unique et aucune autre information, il n'y a pas de solution unique pour les angles. Considérez le cas de Just Yaw. Projeté sur l'avion 2D, cela est visible comme un petit changement de la distance projetée entre les yeux et la mise en place des yeux par rapport au nez / bouche. Cette distance n'est pas une constante de personne à personne.

Une manière typique autour de cela est d'exiger que l'utilisateur "calibrer" son visage en regardant directement la caméra pour les angles nominaux '0'. À ce stade, vous avez maintenant des longueurs de référence sur lesquelles vous pouvez comparer des images ultérieures.

Les longueurs ne sont toujours pas assez d'informations, cependant, comme la quantité que le changement de distances projetées apparentes dépend de l'optique et de la distance de la face de la caméra. L'optique que vous configurez habituellement manuellement; La distance que vous pouvez estimer en supposant des dimensions faciales «moyennes» et en supposant que l'image «nominale» correspond parfaitement à ces dimensions. Vous pouvez faire ce réglable si vous constatez que c'est trop ou sous-estimer les rotations pour un visage particulier.

Une fois que vous avez toutes ces hypothèses en place, c'est une géométrie assez simple. Vous pouvez estimer le rouleau de la ligne des yeux à travers le nez à la bouche. Vous pouvez mesurer l'espacement entre les yeux pour estimer la lacet. Enfin, vous pouvez estimer la hauteur en utilisant l'espacement entre les yeux / la bouche ou les yeux / le nez. N'oubliez pas que ces hypothèses fonctionnent mieux lorsque le visage est toujours assez proche de Nominal.


1 commentaires

Mais j'aimerais connaître une méthode en C ++ pour le faire.



0
votes

Donc, vous voulez trouver l'orientation (dans les angles de RPY) d'un visage à base de la position du nez, des yeux et de la bouche. En supposant que les trois (quatre - deux yeux) sont visibles, j'utiliserais les caractéristiques symétriques de la face pour déterminer l'orientation de la tête, telle que:

Une ligne entre les yeux pourrait être utilisée comme référence pour l'un des axes (par exemple dans la hauteur). Ensuite, nous pouvons supposer que l'axe de rouleau pointe dans la direction du nez - qui peut être mesurée à travers le déplacement de position du nez au milieu entre les yeux. Et enfin, la lacette pourrait être mesurée à travers la relation de distance entre le point médian entre les yeux, la position du nez et la position de la bouche.

Je ne connais pas les relations à distance entre les quatre points d'intérêt, et ils sont probablement différents en ce qui concerne le sexe, l'âge et l'origine. Toutefois, si vous pouvez trouver une telle relation, la dérivation des angles doit être mathématiquement être plutôt simple.

application intéressante à partir de la manière!


0 commentaires

0
votes

Si vous utilisez un classificateur de cascade pour détecter l'œil droit, l'œil gauche et le nez, calculez le centroïde de chaque fonctionnalité (fonction X / 2, fonction Y / 2) Cela vous donnera trois points XY sur votre image.

Vous pouvez détecter le rouleau en regardant les valeurs Y de chaque œil, si l'on est plus élevé que l'autre, cela signifie que la tête est inclinée dans la direction de la valeur Y la plus faible (comme un œil déplace l'autre déplace)

Vous pouvez détecter laceteuse en regardant la valeur X du nez, si l'utilisateur se ressemble à gauche, la valeur X de leur nez sera plus proche de la valeur x de leur œil gauche et de la même chose avec la droite A la valeur des yeux à droite x.

Vous pouvez détecter la hauteur en regardant la valeur Y du nez, si l'utilisateur recherche, la valeur Y sera plus proche des valeurs de Y et si elles ont l'air bas, la valeur Y sera plus éloignée de la valeur oculaire.

Maintenant, cela n'est bien sûr pas extrêmement précis et ne vous donnera pas d'angle exact, mais vous pouvez utiliser ces informations pour essayer de classer chaque Val. ue dans certains groupes, c'est-à-dire (à l'attente, à gauche, à la gauche, à la recherche vraiment à gauche)

La seule chose que je peux voir pour que vous calculiez les trois dans une image dans une seule image pourrait être si le rouleau est Calcul de la lacet assez drastique pourrait être gênant car l'axe X n'est plus plat.

Vous pouvez résoudre ceci en corrigeant l'image à la rotation 2D. Vous devrez trouver combien l'image doit être pivotée avec xxx

avec ces informations que vous pouvez corriger l'image et continuer avec le traitement (pour faire pivoter l'image, recherchez l'image Créer un Matrice de rotation 2D et utilisation de chaîne affine)

Désolé si cela est un peu Necro, mais j'ai trouvé la méthode ci-dessus pour réussir et j'espère que cela aident quelqu'un


0 commentaires