手拍手势的问题

时间:2015-02-28 13:16:38

标签: c# kinect

这是拍拍手势的代码,我使用结果将机器人手臂末端效应器设置为每个拍手的3d位置) 我希望事件处理程序只为每个拍手手势触发一次, 并重置另一个拍手势。但是当我拍手和我的手靠近时,我的事件处理程序继续射击!请问我该怎么纠正这个问题。我可以使用重置方法或其他东西

[手拍代码]

float previousDistance = 0.0f;
    private void MatchClappingGesture(Skeleton skeleton)
    {
        if (skeleton == null)
        {
            return;
        }

        if (skeleton.Joints[JointType.WristRight].TrackingState == JointTrackingState.Tracked && skeleton.Joints[JointType.WristLeft].TrackingState == JointTrackingState.Tracked)
        {

            float currentDistance = GetJointDistance(skeleton.Joints[JointType.WristRight], skeleton.Joints[JointType.WristLeft]);
            {


                if (currentDistance < 0.1f && previousDistance > 0.1f )
                {

                   if (this.GestureRecognized != null)
                    {

                        this.GestureRecognized(this, new  GestureEventArgs(RecognitionResult.Success));
                        previousDate = DateTime.Now;
                   }

                }
                previousDistance = currentDistance;

            }


        }

    }

这是我调用事件处理程序的地方

 private void Window_Loaded(object sender, RoutedEventArgs e)
    {

        try
        {

            kinect = KinectSensor.KinectSensors[0];
            kinect.Start();

        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show("Could not find Kinect Camera: " + ex.Message);
        }

        kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
        kinect.ColorStream.Enable(ColorImageFormat.RgbResolution1280x960Fps12);
        kinect.SkeletonStream.Enable(new TransformSmoothParameters()
        {
            Correction = 0.5f,
            JitterRadius = 0.05f,
            MaxDeviationRadius = 0.05f,
            Prediction = 0.5f,
            Smoothing = 0.5f
        });
        kinect.AllFramesReady += Kinect_SkeletonAllFramesReady;


        recognitionEngine = new GestureRecognitionEngine();
        armEngine = new ArmControllerEngine();

        recognitionEngine.GestureRecognized += new EventHandler<GestureEventArgs>(recognitionEngine_GestureRecognized);
    }

事件处理程序在这里触发

         void recognitionEngine_GestureRecognized(object sender,      

         GestureEventArgs e)
         { 
         //armEngine.setArm(raMove,port,servoId);   
         MessageBox.Show("HI");

        }

消息框打印多次而不是一次!!请帮助

2 个答案:

答案 0 :(得分:0)

您必须记住,Kinect的测量值存在一定程度的不准确性。此外,在某些情况下(例如当手在一起时!!),不准确性会大大增加,并且检测到的关节位置开始在整个地方跳跃。尝试使用SDK提供的骨架查看器,你会看到。这通常通过使用平滑算法来缓解,但在您的情况下可能不是最合适的解决方案。尝试增加你用来检测手势的距离,给它大约20厘米左右(顺便说一句,你的GetJointDistance返回什么?米?然后给它0.2)

答案 1 :(得分:0)

           void wait(int a) 
    {
        for (int i = 0; i < a; i++) ;

    }

         int count = 0;


    void recognitionEngine_GestureRecognized(object sender, GestureEventArgs  e)
     {
        wait(3);
         clapShow();

     }
     //clap method
     void clapShow() 
      {

       count += 1;
        if (count == 1)
        {
            MessageBox.Show("Gesture Capture Within >> " + time.Millisecond.ToString()  +   " milli Seconds");

        }
        count = 0 ; 
        } 
}

我每3毫秒wait(3)将消息框称为一个方法,这样可以减慢事件处理程序的速度。 然后在一个手势之前将计数设置为“1”,然后在每个拍手手势之后将其设置为“0”并且它的效果非常好!! 注意!.... wait(X)方法我创建了一个简单的循环,倒计数到X.它可以是任何基于所需灵敏度级别的值。谢谢你! 我希望这有助于某人..