【问题标题】:Issues with hand Clapping gesture拍手的问题
【发布时间】:2015-03-02 03:08:15
【问题描述】:

这是我拍手的代码,我使用结果将机械臂末端执行器设置为每次拍手的 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");

        }

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

【问题讨论】:

    标签: c# kinect


    【解决方案1】:

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

    【讨论】:

    • GetJointDistance 只是返回双手之间的距离。我对距离没有问题。我只想在检测到手势后重置该方法……这样它就不会触发事件,直到我再次鼓掌。但现在,如果我鼓掌一次并保持双手合十,事件就会不断重复。
    • 各位大侠帮帮忙!!
    • 我打算建议添加一个标志以避免重复事件,但是您拥有的 previousDistance 变量应该注意这一点。您是否按照我的建议尝试过简单地将测试中指定的距离从 0.1 增加到 0.2,或者更多一点?
    • 终于成功了!!谢谢你的提示对兄弟有帮助
    • 很高兴为您提供帮助:)
    【解决方案2】:
               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 值。它可以是任何值,基于所需的灵敏度级别。谢谢何塞!! 我希望这对某人有所帮助..

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 2018-09-08
      相关资源
      最近更新 更多