2015-07-23 2 views
0

J'ai un problème pour aligner les faces en utilisant opencv. Je détecte le visage puis j'utilise des flandmarks et calcule l'angle de rotation. J'utilise cette fonction pour faire pivoter l'image:alignement de face pour la reconnaissance faciale

cv::Mat rotate(cv::Mat src, double angle) 
{ 
    cv::Mat dst; 
    cv::Point2f pt(src.cols/2., src.rows/2.); 
    cv::Mat r = getRotationMatrix2D(pt, angle, 1.0); 
    cv::warpAffine(src, dst, r, cv::Size(src.cols, src.rows)); 
    return dst; 
} 

Je veux trouver la nouvelle position des yeux après la rotation pour rogner le visage en fonction du centre yeux.

+0

Effectuez-vous la détection oculaire AVANT l'alignement et allez-vous trouver la région correspondante après la rotation, ou allez-vous simplement effectuer une détection oculaire APRÈS la rotation? – Derman

+0

Je détecte les yeux puis tourne en fonction de la position des yeux ... après cela, je veux trouver la nouvelle position des yeux pour recadrer le visage – Tyranitar

Répondre

0

pour faire tourner (dans le sens antihoraire par un angle θ) d'un point (x, y) autour d'un autre point (p, q), il faut utiliser:

x′ = (x−p)cos(θ)−(y−q)sin(θ)+p, 
y′ = (x−p)sin(θ)+(y−q)cos(θ)+q. 

où x 'y' sont les coordonnées après rotation . Dans votre cas (p, q) est le centre de l'image si vous avez pivoté autour du centre. Explication détaillée peut être trouvé ici: https://math.stackexchange.com/questions/270194/how-to-find-the-vertices-angle-after-rotation

Donc, si vous avez des yeux segmentés comme certaines zones, vous devez effectuer cette opération sur chaque pixel de la zone détectée comme yeux.