face tracking

face tracking - C++ - Programmation

Marsh Posté le 02-06-2010 à 20:29:43    

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 .

Reply

Marsh Posté le 02-06-2010 à 20:29:43   

Reply

Marsh Posté le 02-06-2010 à 20:57:15    

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
Reply

Marsh Posté le 02-06-2010 à 21:29:50    

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.

Reply

Marsh Posté le 02-06-2010 à 21:41:49    

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
Reply

Marsh Posté le 02-06-2010 à 22:06:46    

snafu8, on avait dit cool avec les gens :p

Reply

Marsh Posté le 02-06-2010 à 22:11:20    

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
Reply

Marsh Posté le 02-06-2010 à 23:46:46    

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?

Reply

Marsh Posté le 03-06-2010 à 00:01:52    

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
Reply

Marsh Posté le 03-06-2010 à 00:08:53    

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"?  

Reply

Marsh Posté le 03-06-2010 à 10:17:44    

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

Reply

Marsh Posté le 03-06-2010 à 10:17:44   

Reply

Marsh Posté le 03-06-2010 à 13:22:17    

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

Reply

Marsh Posté le 03-06-2010 à 14:46:12    

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

Reply

Marsh Posté le 03-06-2010 à 15:40:15    

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)  

Reply

Marsh Posté le 03-06-2010 à 16:01:26    

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
Reply

Marsh Posté le 04-06-2010 à 07:51:15    

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

Reply

Marsh Posté le 04-06-2010 à 19:09:16    

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

Reply

Marsh Posté le 04-06-2010 à 20:31:00    

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

Reply

Marsh Posté le 09-06-2010 à 13:14:30    

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
Reply

Marsh Posté le 09-06-2010 à 15:07:48    

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;}


Reply

Marsh Posté le 09-06-2010 à 15:27:12    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed