Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1445 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  face tracking

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

face tracking

n°1998502
dreamvig
Posté le 02-06-2010 à 20:29:43  profilanswer
 

bonjour,
je voudrais suivre un visage (face tracking) par une méthode cylindrique comme il montre ce vidéo
http://www.consortium.ri.cmu.edu/d [...] r_Only.avi
je travaille avec c++,opencv,opengl
pour cela j'ai fais les deux première étapes étapes :
1-détection de visage  
2-construction d'une cylindre par Opengl  
3-application de la cylindre sur le visage  
il me reste que la méthode de suivi . il existe une méthode qui s'appelle KLT  
pourriez vous m'aider pour connaitre comment je faire cette étape .

mood
Publicité
Posté le 02-06-2010 à 20:29:43  profilanswer
 

n°1998509
esox_ch
Posté le 02-06-2010 à 20:57:15  profilanswer
 

Question à  la con : Pourquoi ne pas passer par une analyse type transformée de Fourier?  
Pour détecter la translation d'un objet, il me semble que c'est le plus simple non ?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1998518
snafu8
Posté le 02-06-2010 à 21:29:50  profilanswer
 

réponse à la con : parce qu'on est plus dans les années 60. Réponse un peu moins à la con : même si ça s'appelle Fast Fourrier Transform, c'est pas si fast que ça et une fois que t'as calculé ta TF, t'es loin d'avoir fini.
 
@Dreamvig : Comment réalise tu ta détection de visage? Par une classif de Haar, ou par une autre méthode? SOn va partir du principe que ta méthode est pas assez rapide/performante pour te permettre de considérer que tu détectes le visage à tous les coups.
 
Pour la méthode KLT, dans openCV, tu peux utiliser la fonction qui s'appelle (de mémoire) cvGoodFeaturesToTrack(stuff) et ensuite cvCalcLkPyr(stuff), c'est une implémentation de cette méthode. Tu peux chercher la publi originelle de Kanade-Lucas-Tomasi qui présente le truc, mais pour faire simple, on extrait des points de harris, et on cherche à estimer le mouvement de ces points par une méthode proche de celle de LK pour calculer du flot optique (équation de conservation de la lumiosité + contrainte de lissage) et tout se passe bien. Ca marche pas trop mal quand tu es dans un monde de bisounours (caméra fixe, un seul objet qui bouge et pas vite, mouvement plan...). Si tu as une cadence très lente (ou un mouvement très rapide) tu devras passer sur des trucs plus robuste (genre SURF). J'ai pas réussi à voir ta vidéo, donc je sais pas trop à quoi tu es confronté.  
 
Bonne chance.

n°1998522
esox_ch
Posté le 02-06-2010 à 21:41:49  profilanswer
 

Merci :bounce:


Message édité par esox_ch le 02-06-2010 à 21:41:59

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1998542
Joel F
Real men use unique_ptr
Posté le 02-06-2010 à 22:06:46  profilanswer
 

snafu8, on avait dit cool avec les gens :p

n°1998548
esox_ch
Posté le 02-06-2010 à 22:11:20  profilanswer
 

Non mais c'est bon :bounce: Je savais que c'était une question conne.
Je demande juste parce que c'est ce qu'on utilisait en cours avec des vidéos de bactéries qui bougeaient dans tous les sens. Vu que le framerate était bas (ça bouge pas très vite une bactérie :D) la FFT allait très bien, et donc je me demandais pourquoi il l'utilisait pas.


Message édité par esox_ch le 02-06-2010 à 22:11:35

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1998595
snafu8
Posté le 02-06-2010 à 23:46:46  profilanswer
 

A ma connaissance, la TF peut être utile dans un cas : quand tu as une image qui présente du motion blur et que tu veux l'enlever, tu peux analyser ton image en fourrier, puis la déconvoluer par la quantité correspondant à ta translation. Attention hein, je dis pas que la TF sers à rien, je dis juste qu'elle sert plus à rien depuis la guerre de Corée. Dans ton cas, les bactéries étaient vues au microscope donc mouvement plan+caméra immobile. Ca, ajouté que fait que tu étais à l'école (on avait pas le temps de te bourrer le crâne avec des trucs utiles  :p) explique probablement l'utilisation de techniques préhistoriques. Pour info, c'est dans quelle formation qu'on apprends la TF comme technique de traitements des images du 21e siècle?

n°1998602
esox_ch
Posté le 03-06-2010 à 00:01:52  profilanswer
 

Personne à jamais dit que c'était du 21 ème siècle. Par contre dans un cours d'introduction au traitement d'image, donné dans un auditoire composé de gens ayant un parcours très varié (informaticiens, biologistes, électroniciens) , je trouve que c'est déjà pas mal..
Après j'ai jamais eu de cours plus poussés sur le traitement de vidéo, j'ai plutôt continué dans le traitement de son (et un petit peu d'images). Donc au revoir Fourier, bonjour wavelets.


Message édité par esox_ch le 03-06-2010 à 00:02:42

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1998604
dreamvig
Posté le 03-06-2010 à 00:08:53  profilanswer
 

bonsoir,
bon, premièrement je vous remercie pour vos attention à ma question.  

snafu8 a écrit :


@Dreamvig : Comment réalise tu ta détection de visage? Par une classif de Haar, ou par une autre méthode? SOn va partir du principe que ta méthode est pas assez rapide/performante pour te permettre de considérer que tu détectes le visage à tous les coups.


-j'ai la réaliser par la méthode de classif de haar .
-pour connatitre les coordonnée du  visage j'ai utilisé ce code

Code :
  1. cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
  2.          storage = cvCreateMemStorage( 0 );
  3.          Rect=*detect_and_draw(cvLoadImage("c:/try/per.jpg" ));


et pour déssiner la cylindre j'ai fais une appèle à une fonction  

Code :
  1. drawCylinder(Rect.width/2,Rect.height);


est ce que je peux considérer ces 2 point qui j'ai les utilisées pour déssiner la cylindre comme des points d'intérêts  au lieu d'utiliser cette fct "cvGoodFeaturesToTrack"?  

n°1998657
snafu8
Posté le 03-06-2010 à 10:17:44  profilanswer
 

Bah effectivement, si à chaque image, tu es capable de localiser le centroïde du visage t'as pas besoin de le suivre hein. C'est toi qui voulais faire du KLT...

mood
Publicité
Posté le 03-06-2010 à 10:17:44  profilanswer
 

n°1998744
dreamvig
Posté le 03-06-2010 à 13:22:17  profilanswer
 

mon problème est que j'ai pas trouvé un article ou une explication décrire comment on applique KLT pour tracker le visage . tous ce que j'ai trouvé un article théorique

n°1998800
snafu8
Posté le 03-06-2010 à 14:46:12  profilanswer
 

Tout dépend de l'information que tu veux obtenir.

n°1998847
dreamvig
Posté le 03-06-2010 à 15:40:15  profilanswer
 

je voudrais connaitre comment on implémente la méthode de KL pour que être capable de tracker le visage (les matrices utilisés , j'ai lu qu'il existe 6 point de liberté  dans visage 3 pour translation et 3 pour rotation  
mais j'ai pas bien compris le rôle de ces points ainsi que comment on les implémente avec ou dans KLT ( je suis débutante dans le domaine de traitement d'image)  

n°1998857
dreamvig
Posté le 03-06-2010 à 16:01:26  profilanswer
 

snafu8 a écrit :

r
 
Pour la méthode KLT, dans openCV, tu peux utiliser la fonction qui s'appelle (de mémoire) cvGoodFeaturesToTrack(stuff) et ensuite cvCalcLkPyr(stuff), c'est une implémentation de cette méthode. Tu peux chercher la publi originelle de Kanade-Lucas-Tomasi qui présente le truc, mais pour faire simple, on extrait des points de harris, et on cherche à estimer le mouvement de ces points par une méthode proche de celle de LK pour calculer du flot optique (équation de conservation de la lumiosité + contrainte de lissage) et tout se passe bien. Ca marche pas trop mal quand tu es dans un monde de bisounours (caméra fixe, un seul objet qui bouge et pas vite, mouvement plan...). Si tu as une cadence très lente (ou un mouvement très rapide) tu devras passer sur des trucs plus robuste (genre SURF). J'ai pas réussi à voir ta vidéo, donc je sais pas trop à quoi tu es confronté.  
 
Bonne chance.


1- j'ai pas compris l'idée de l'utilisation de  cvGoodFeaturesToTrack(stuff) et ensuite cvCalcLkPyr(stuff)? (je crois que on ne peut pas utilisé   cvGoodFeaturesToTrack avec la méthode de destruction de haar , parce que à ma connaissance ils font le même travail .
2- pourriez vous me citer ou expliques les autre méthodes de face tracking  utilisées dans les cas où le mouvement et très rapide ? (parce que il est possible que la personne bouge sa tête rapidement )


Message édité par dreamvig le 03-06-2010 à 16:09:07
n°1998989
dreamvig
Posté le 04-06-2010 à 07:51:15  profilanswer
 

je voudrais savoir aussi qu'elle est la meilleure cas camshift ou Kl?

n°1999200
snafu8
Posté le 04-06-2010 à 19:09:16  profilanswer
 

Je vais tâcher de te répondre dans l'ordre (pour la prochaine fois, pense à éditer tes messages au lieu d'en rajouter, c'est plus facile à suivre).  
 
Effectivement, l'objet que tu suis à  6 degré de liberté (ce n'est pas forcément vrai, la mobilité du cou doit être plus réduite que ça ,mais passons). Si ce que tu veux, c'est estimer le mouvement de la tête entre deux images, il faut que tu écrives toutes les équations du mouvement, pour connaître l'impact visuel du mouvement sur ton visage, d'observer ce déplacement et de remonter jusqu'au déplacement. Pour l'info, il n'est pas possible, en monoculaire, et sans contrainte supplémentaire de déterminer un mouvement 6D absolument. DOnc je pense que ton problème n'est pas d'estimer tout le mouvement de la tête.
 
CvGoodFeaturesToTrack(...) te permet d'extraire de l'image les points d'intérêt sur lesquels tu vas estimer le mouvement. Ta méthode de classification/détection ne te permet que de suivre le centroïde de la forme, ce n'est pas suffisant pour une estimation d'un mouvement autre que translationel 2D.
 
Je ne suis pas un spécialiste de face tracking désolé. Pour des méthodes de suivi plus robustes, tu devrais regarder du côté des points d'intérêts robustes (SIFT, SURF, Star...).
 
Pour l'implémentation de LK, pour le cas particulier du KLT, tout est dans la doc openCV http://opencv.willowgarage.com/doc [...] lflowpyrlk

n°1999211
dreamvig
Posté le 04-06-2010 à 20:31:00  profilanswer
 

merci pour votre aide snafu8
j'ai compris un peu maintenant.

n°2000197
dreamvig
Posté le 09-06-2010 à 13:14:30  profilanswer
 

je n'arrive pas à travaillé avec cvGoodFeaturesToTrack avec mon programme de tracking . j'ai programmé un code qui a pour but de suivi visage par KL mais j'ai pas utilisé la notion de point d'intérêt j'ai  trouvé ici un exemple sur cvGoodFeaturesToTrack  
http://opencv.willowgarage.com/doc [...] lflowpyrlk
et mon programme est le suivant

Code :
  1. // (u,v)appartient T.
  2.  int u, v;
  3.  // parcour T
  4.  int i, j;
  5.  for(i=0; i<omega.width; i++)
  6.  {
  7.   u = i + omega.x;
  8.   for(j=0; j<omega.height; j++)
  9.   {
  10.    v = j + omega.y;
  11.    // X =(u,v,1)
  12.    SET_VECTOR(X, u, v);
  13.    // Z=W*X
  14.    cvGEMM(W, X, 1, 0, 0, Z);
  15.    // (u2,v2) appart I.
  16.    float u2, v2;
  17.    GET_VECTOR(Z, u2, v2);
  18.    int u2i = cvFloor(u2);
  19.    int v2i = cvFloor(v2);
  20.    if(u2i>=0 && u2i<pImgI->width && // si pixel appart I.
  21.     v2i>=0 && v2i<pImgI->height)
  22.    {
  23.     pixel_count++;
  24.     //gradient warpé
  25.     // interpolation.
  26.     float Ix = interpolate<short>(pGradIx, u2, v2);
  27.     float Iy = interpolate<short>(pGradIy, u2, v2);
  28.     //  steepest descent  
  29.     float stdesc[3];
  30.     stdesc[0] = (float)(-v*Ix+u*Iy);
  31.     stdesc[1] = (float)Ix;
  32.     stdesc[2] = (float)Iy;
  33.     //intensité par interpolation.
  34.     float I2 = interpolate<uchar>(pImgI, u2, v2);
  35.     // difference D = T(x)-I(W(x,p)).
  36.     float D = CV_IMAGE_ELEM(pImgT, uchar, v, u) - I2;
  37.     // mise à jour
  38.     mean_error += fabs(D);
  39.     // ajouter à matr
  40.     float* pb = &CV_MAT_ELEM(*b, float, 0, 0);
  41.     pb[0] += stdesc[0] * D;
  42.     pb[1] += stdesc[1] * D;
  43.     pb[2] += stdesc[2] * D;
  44.     // ajouter à Hess.
  45.     int l,m;
  46.     for(l=0;l<3;l++)
  47.     {
  48.      for(m=0;m<3;m++)
  49.      {
  50.       CV_MAT_ELEM(*H, float, l, m) += stdesc[l]*stdesc[m];
  51.      }
  52.     }
  53.    }
  54.   }
  55.  }


 
pourrize vous m'aider pour travaillé avec cvGoodFeaturesToTrack  dans mon pgm. SVP


Message édité par dreamvig le 09-06-2010 à 13:17:54
n°2000261
snafu8
Posté le 09-06-2010 à 15:07:48  profilanswer
 

Je suis pas sûr de comprendre ce que tu fais (tu essaies de ré-implémenter LK?), mais ci après, un bout de code, qui fait appel au deux, que j'utilisais il fut un temps pour faire de l'estimation de mouvement :  
 
 

Code :
  1. #include "OpenCV/OpenCV.h"
  2. #include <iostream>
  3. int main(int argc, char argv[])
  4. {
  5. CvCapture * loader = cvCreateFileCapture(chemin_vers_fichier_avi);
  6. IplImage * toto = cvQueryFrame(loader);
  7. IplImage * totoNB = cvCreateImage(cvGetSize(toto), 8, 1);
  8. IplImage * toto_previous = cvCreateImage(cvGetSize(toto), 8, 1);
  9. IplImage * eig_image = cvCreateImage(cvGetSize(toto),IPL_DEPTH_32F , 1);
  10. IplImage * temp_image = cvCreateImage(cvGetSize(toto), IPL_DEPTH_32F, 1);
  11. bool first = true;
  12. CvPoint2D32f corners[500];
  13. CvPoint2D32f corners_previous[500];
  14. CvPoint2D32f corners_flot[500];
  15. char status[500];
  16. int corner_count;
  17. cvNamedWindow("toto", CV_WINDOW_AUTOSIZE);
  18. CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 10, 0.1);
  19. CvScalar blanc = cvScalarAll(255);
  20. while(toto = cvQueryFrame(loader))
  21. {
  22.  corner_count = 500;
  23.         cvCvtColor(toto, totoNB, CV_BGR2GRAY);
  24.  cvGoodFeaturesToTrack(totoNB, eig_image, temp_image, corners, &corner_count, 0.01, 3.0, NULL, 11, 0, 0);
  25. if(!first)
  26. {
  27.  cvCalcOpticalFlowPyrLK(toto_previous, totoNB, NULL, NULL, corners_previous,
  28.          corners_flot, corner_count, cvSize(11, 11), 1, status, NULL, criteria, 0);
  29.  for(int i = 0 ; i < corner_count ; ++i)
  30.  {
  31.   CvPoint pt1, pt2;
  32.   pt1.x = floor(corners_flot[i].x + 0.5);
  33.   pt1.y = floor(corners_flot[i].y + 0.5);
  34.   pt2.x = floor(corners_previous[i].x + 0.5);
  35.   pt2.y = floor(corners_previous[i].y + 0.5);
  36.   cvLine(totoNB, pt1, pt2, blanc, 1);
  37.  }
  38.  cvShowImage("toto", totoNB);
  39. }
  40.  cvCopy(totoNB, toto_previous, NULL);
  41.  for(int i = 0 ; i < 500 ; ++i)
  42.  { corners_previous[i].x = corners[i].x;
  43. corners_previous[i].y = corners[i].y;}
  44.  first = false;
  45. }
  46. return 0;}


n°2000269
dreamvig
Posté le 09-06-2010 à 15:27:12  profilanswer
 

snafu8 a écrit :

Je suis pas sûr de comprendre ce que tu fais (tu essaies de ré-implémenter LK?)


oui j'ai essayé de faire ça , le code précédent et un procédure qui implémente LK
mais j'ai pas utilisé dans cette implémentation les point d'intérêt j'ai travaillé avec toute le visage (qui est encadré par cvrect)

Code :
  1. void ALK(IplImage* pImgT, CvRect omega, IplImage* pImgI,CvMat *W)


  alors dans ma cas au lieu de faire comme vous

Code :
  1. cvCalcOpticalFlowPyrLK(toto_previous, totoNB, NULL, NULL, corners_previous,
  2.      corners_flot, corner_count, cvSize(11, 11), 1, status, NULL, criteria, 0);


j'appele ma procédure

Code :
  1. void ALK(corners_previous, CvRect omega, corners,CvMat *W)


comme ça ?

  



Message édité par dreamvig le 09-06-2010 à 15:28:55

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  face tracking

 

Sujets relatifs
[Matlab] Générer automatiquement des évènements de face avantstd vector : tracking des adresses des objets contenus
[WINDEV] Avis sur ce produit face à .NET[PHP] tracking avec une image (xiti like)
[OpenGL] Savoir si une face est éclairé[python] DONE : script de tracking UPS multithreadé
[openGL] Rotation d'un objet face a un point[Flash] Application d'un TAG de Tracking
[VB6] Debug & Tracking "erreur automation"C# ca fait pitié face a java, et en plus ca donne pas de taff
Plus de sujets relatifs à : face tracking


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR