我正在编写一个基于Kinect的应用程序。我需要执行右挥手势。我使用C#从Internet找到了一个代码片段,但是对此代码有些疑问。你能帮助我吗?
编码:
public class KinectClass
{
public void KinectInitialize ()
{
m_myKinect.Start();
m_myKinect.SkeletonStream.TrackingMode = SkeletonTrackingMode.Seated;
m_myKinect.SkeletonFrameReady += m_myKinect_SkeletonFrameReady;
}
void m_myKinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
using (SkeletonFrame frame = e.OpenSkeletonFrame())
{
if (frame != null)
{
if (0 == frame.SkeletonArrayLength) return;
m_skeletons = new Skeleton[frame.SkeletonArrayLength];
if (m_skeletons == null) return;
frame.CopySkeletonDataTo(m_skeletons);
}
}
foreach (Skeleton skeleton in m_skeletons)
{
if (skeleton.TrackingState == SkeletonTrackingState.Tracked)
{
UpdateSkeletonHistory(skeleton);
value = gestureobject.Detectgesture();
}
}
}
}
此外,还有一个Gesture类正在检查wave函数:
class Gesture
{
private List<Skeleton> SkeletonHistory;
private List<Skeleton> localSkeletonHistory;
public void UpdateSkeletonHistory(Skeleton SkeletonData)
{
SkeletonHistory.Add(SkeletonData);
if (SkeletonHistory.Count > 90)
{
SkeletonHistory.RemoveAt(0);
}
return ;
}
public short Detectgesture()
{
short sReturnvalue = -1;
int gesturePeriod = 2;
int indexesPerSecond = 30;
int indexesToCheck = gesturePeriod * indexesPerSecond;
localSkeletonHistory = new List<Skeleton>(SkeletonHistory);
if (m_SkeletonHistory.Count > indexesToCheck)
{
localSkeletonHistory = new List<Skeleton>(m_SkeletonHistory);
if( waveright() )
{
Console.Writeline("waveright");
}
}
}
private bool waveright()
{
Console.WriteLine("wave right START");
bool Movedright = false,
Movedleft = false;
float refDistance = 0.2F;
float startPos = localSkeletonHistory[0].Joints[JointType.HandLeft].Position.X;
for (int i = 0; i < localSkeletonHistory.Count; i++)
{
if (!(localSkeletonHistory[i].Joints[JointType.HandLeft].Position.Y <= localSkeletonHistory[i].Joints[JointType.Head].Position.Y))
{
break;
}
if (localSkeletonHistory[i].Joints[JointType.HandLeft].Position.X >= (startPos + refDistance))
{
Movedright = true;
}
if (Movedright && Math.Abs(localSkeletonHistory[i].Joints[JointType.HandLeft].Position.X - startPos) <= 0.1 )
{
Movedleft = true;
m_SkeletonHistory.Clear();
break;
}
}
return Movedleft;
}
}
我可以理解Kinect函数,但是我对手势函数感到困惑。我的问题如下:
您需要记住的是,仅仅因为手相对于身体的位置是正确的。这并不意味着他们挥舞着正确的声音。
波浪右移是向右移的过渡。因此,您无法通过当前位置确定该位置。这就是为什么您需要使用SkeletonHistory跟踪以前的位置的原因。
因此,该算法的简要概述是:
For the previous positions since the last triggered gesture:
If each Skeleton's Y position is greater than the last, then the person is waving right
当然,一只手会向右移动很多次,但这并不意味着它是右挥手。因此,您需要确定一只手必须向右移动多长时间,才能使其成为真正的waveRight手势。
refDistance是一种说法,手必须至少移动此距离才能被归类为波权。
在这里,我相信编码人员说的是手势至少需要持续2秒钟。因此,如果我们每秒获得30个骨架,那么我们需要检查最后60个骨架:
int indexesToCheck = gesturePeriod * indexesPerSecond;
实际上,msdn文档对于这些东西非常有用:
https://msdn.microsoft.com/zh-CN/library/jj131025.aspx
我发现这本书非常适合入门:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句