Où puis-je apprendre / trouver des exemples de reconnaissance gestuelle de Kinect en streaming, en utilisant OpenCV?

StackOverflow https://stackoverflow.com/questions/4457724

Question

J'ai Kinect et les pilotes pour Windows et MacOSX. Existe-t-il des exemples de reconnaissance gestuelle de Kinect ont afflué en utilisant l'API OpenCV? Je suis en train d'atteindre similaire à DaVinci prototype sur Xbox Kinect mais dans Windows et MacOSX.

Était-ce utile?

La solution

Je pense que ce ne sera pas en ce simple surtout parce que les données d'image en profondeur de kinect n'est pas si sensible. Ainsi, après une distance de 1 m à 1,5 m tous les doigts seront fusionnés et donc vous ne pourrez pas obtenir un contours clairs pour détecter les doigts

Autres conseils

La démo de votre lien ne semble pas utiliser réelle geste reconnaissance. Il distingue juste entre deux positions de main différents (ouvert / fermé), ce qui est beaucoup plus facile, et suit la position de la main. Compte tenu de la façon dont il tient ses mains dans la démo (en face du corps, face à la kinect quand ils sont ouverts), voici probablement ce qu'il fait. Puisque vous ne l'avez pas précise quelle langue que vous utilisez, je vais utiliser les noms de fonctions C dans OpenCV, mais ils devraient être similaires dans d'autres langues. Je suppose aussi que vous êtes en mesure d'obtenir la carte de profondeur de la kinect (probablement via une fonction de rappel si vous utilisez libfreenect).

  1. Seuil sur la profondeur pour sélectionner uniquement les points assez près (les mains). Vous pouvez obtenir que soit vous-même, ou directement à l'aide OpenCV pour obtenir une image binaire (cvThreshold () avec CV_THRESH_BINARY). Affichez l'image que vous obtenez après seuillage et ajuster la valeur de seuil pour l'adapter à votre configuration (essayez d'éviter d'être trop près de la kinect car il y a plus d'ingérence dans ce domaine).

  2. Obtenez le contour des mains avec cvFindContour ()

la base. Maintenant que vous avez les contours des mains, en fonction de ce que vous voulez faire, vous pouvez prendre des directions différentes. Si vous voulez juste détectez entre la main ouverte et fermée, vous pouvez probablement faire:

  1. Obtenez la coque convexe des mains à l'aide cvConvexHull2 ()

  2. Obtenez les défauts de convexité à l'aide cvConvexityDefect () sur les contours et la coque convexe vous avez avant.

  3. analyser les défauts de convexité:. S'il y a de grands défauts, la main est ouverte (parce que la forme est concave entre les doigts), sinon la main est refermée

Mais vous pouvez aussi faire la détection des doigts! Voilà ce que je l'ai fait la semaine dernière, qui ne nécessite pas beaucoup plus d'efforts et probablement augmenter votre démo! Une façon pas cher mais assez fiable pour le faire est:

  1. Approx les contours de la main avec un polygone. Utilisation cvApproxPoly () sur le contour. Vous devrez régler le paramètre de précision à un polygone aussi simple que possible, mais cela ne mélange pas les doigts (environ 15 devrait être assez bon, mais dessiner sur vous image à l'aide cvDrawContours () pour vérifier ce que vous obtenez) .

  2. Analyser le contour de trouver des angles convexes tranchants. Vous devrez le faire manuellement. Ceci est la plupart délicate, parce que:

    • Les structures de données utilisées dans OpenCV pourrait être un peu déroutant au premier abord. Si vous luttez trop avec la structure de CvSeq, cvCvtSeqToArray () pourrait aider.
    • Vous arrivez finalement à faire un peu (de base) mathématiques pour trouver les angles convexes. Rappelez-vous que vous pouvez utiliser un produit scalaire pour déterminer comment un angle est aigu, et un produit vectoriel pour distinguer entre convexe et angles concaves.
  3. Ici, vous êtes, les angles convexes sont pointus du bout des doigts!

Ceci est un algorithme simple pour détecter les doigts, mais il y a plusieurs façons de le stimuler. Par exemple, vous pouvez essayer d'appliquer un filtre médian sur la carte de profondeur pour tout « lisser » un peu, ou d'essayer d'utiliser une approximation de polygones plus précis, mais puis filtrer le contour de fusionner les points qui doivent fermer sur le bout des doigts, etc. .

Bonne chance et amusez-vous!

dest = new mage image (this.bitmap.Width, this.bitmap.Height);                    CvInvoke.cvThreshold (src, dest, 220, 300, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY);                    Bitmap NEM1 = new Bitmap (dest.Bitmap);                    this.bitmap = NEM1;                    Graphics g = Graphics.FromImage (this.bitmap);

                using (MemStorage storage = new MemStorage()) //allocate storage for contour approximation
                    for (Contour<Point> contours = dest.FindContours(); contours != null; contours = contours.HNext)
                    {
                        g.DrawRectangle(new Pen(new SolidBrush(Color.Green)),contours.BoundingRectangle);
                       // CvInvoke.cvConvexHull2(contours,, Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE, 0);
                        IntPtr seq = CvInvoke.cvConvexHull2(contours,storage.Ptr, Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE, 0);
                       IntPtr defects = CvInvoke.cvConvexityDefects(contours, seq, storage);
                      Seq<Point> tr= contours.GetConvexHull(Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE);

                      Seq<Emgu.CV.Structure.MCvConvexityDefect> te = contours.GetConvexityDefacts(storage, Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE);
                      g.DrawRectangle(new Pen(new SolidBrush(Color.Green)), tr.BoundingRectangle);
                      //g.DrawRectangle(new Pen(new SolidBrush(Color.Green)), te.BoundingRectangle);

                    }

Je l'ai fait selon votre algorithme, mais il ne fonctionne pas Qu'est-ce essorer?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top