这是拍拍手势的代码,我使用结果将机器人手臂末端效应器设置为每个拍手的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");
}
消息框打印多次而不是一次!!请帮助
答案 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.它可以是任何基于所需灵敏度级别的值。谢谢你!
我希望这有助于某人..