none
reconnaissance de geste de la main avec kinect RRS feed

  • Question

  • Bonjour à Tous,

    Je débute en développement sur la Kinect et j'utilise le sdk de win V1.0. ^^

    J'ai essayé de suivre l'exemple de SkeletonTracking pour afficher à l'écran un simple message qui affiche les coordonnées de la main droite et

    affiche un message de type "vous avancez la main" ou "vous reculez la main" !

    pour ceci j'ai déclaré un tableau pour sauvegarder les positions Z de la main et à chaque fois je compare la valeur de tab[i] avec tab[i-1]

    pour estimer le geste! 

    Voilà mon une partie du code:

    dans le Main window j'ai définit le tableau

    public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
           
            const int skeletonCount = 6;
            const int POSLEN = 500; 
            bool closing = false;
            float[] postab = new float[POSLEN] ;
            Skeleton[] allSkeletons = new Skeleton    [skeletonCount];
             
    
    
    
                    
     

    puis dans l'événement NewSensor_AllFrameReady:

    void NewSensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
            {
                if (closing)
                {
                    return;
                }
    
                //detecter la première squelette
                Skeleton first = GetFirstSkeleton(e);
              
                if (first == null)
                {
                    return;
                }
                
                         
    
                Joint j = first.Joints[JointType.HandRight];
             
    
                if (j.TrackingState == JointTrackingState.Tracked)
                {
                            
                    txtHR.Text = "Position Main Droite:";
                    cd.Text = ("X: " + j.Position.X + "\nY: " + j.Position.Y + "\nZ: " + j.Position.Z);
                    postab[0] = 0; 
                    for (int i = 1; i < POSLEN; i++)
                    {
                        postab[i] = j.Position.Z;
                        posz.Text = ("Z=" + j.Position.Z);
                     
                        if (postab[i] > postab[i-1])
                        {
                            gest.Text = " vous reculez la main";
    
                        }
                        else 
                        {
                            gest.Text = " vous avancez la main";
                        }
                        
                        i++;
                    }
    }

    en exécutant le code ça beug et affiche toujours "vous reculez la main"!

    pouvez vous m'ader à résoudre ce problème ou trouver une une méthode plus simple ? 
    Merci pour toute aide^^ 



    • Modifié Pink192 lundi 30 juillet 2012 09:32
    lundi 30 juillet 2012 09:25

Toutes les réponses

  • Bonjour,

    Un forum Kinect serait sans doute plus adapté. Je m'attendrais à ce qu'il y ait une bibliothèque toute faite permettant de reconnaitre les gestes de base. Sinon déboguer Z. On voit quoi comme valeurs successives de Z ?

    Je ne suis pas sûr de comprendre la logique. On altère toutes les cellules du tableau à chaque frame ? On ne voudrait pas plutôt altérer juste une position et garder les 500 précédentes ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    lundi 30 juillet 2012 09:40
    Modérateur
  • Salut Patrice,

    j'ai posté dans un forum kinect mais et j'attends encore une réponses..

    Pour la reconnaissance de gestes j'ai vu que des outils de reconnaissances faciale et de gestes sont disponible sous le SDk 1.5 mais je sais pas à quel point je peux reconnaitre les gestes avec cette version.

    Bréf, j'ai pensé que si je prends la première position en Z dans la frame comme nulle et à chaque position je récupère la valeur et je la compare à la valeur précédente je peux savoir le type de mouvement  de la main!

    Vous pensez pas que cette logique est utile? 

    lundi 30 juillet 2012 09:52
  • Ce que je ne vois pas c'est que dans la boucle on lit  j.Position à chaque fois.

    La position est mise à jour en permanence et susceptible de varier à chaque lecture où lle est disponible une fois pour toute à chaque frame et ne sera mise à jour qu'à la frame suivante ?

    Pour l'instant, j'afficherais juste la valeur de Z pour voir...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    lundi 30 juillet 2012 10:04
    Modérateur
  • Honnêtement je ne sais pas si c'est mis à jours à chaque lecture ou bien une fois pour toute pour chaque frame :(
    lundi 30 juillet 2012 10:24

  • Bonjour

    La kinect envoie environ 30 FPS (30 skeleton par seconde).
    Pour évaluer un mouvement le plus simple est de garder une liste List<Vector3D> qui représente la position en x,y,z de la main dans le temps.

    A chaque passage dans le allframeready tu ajouter lstHand.Add(j.Position) ce qui te donne une liste de point qui représente le mouvement de ta main dans un temps x. (30 points plus ou moins égale 1 seconde).

    En général pour détecter des mouvements entre 25 et 45 points sont nécessaire ensuite tu dois retirer le plus vieux points dans ta liste pour en ajouter un plus récent (concepte d'une LiFo). Tu veux éviter de garder en mémoire trop d'historique.

    Dans ton cas seulement le point précédent semble être important (comparer sur le moment est-ce que la main est plus près ou plus loin de la Kinect)

    un simple float qui contiens la valeur en Z de la main précédente sera suffisant.


                Joint j = first.Joints[JointType.HandRight];
                 

                if (j.TrackingState == JointTrackingState.Tracked)
                {
                    //Compare lastPosition with j.Position.Z
                    if(lastPosition > j.Position.Z)
                    //do something according to result.


                    //save the current hand position.
                    lastPosition = j.Position.Z;
                }         


    jeudi 22 novembre 2012 18:04