Я пишу приложение на основе Kinect. Мне нужно реализовать волнообразный жест. Я нашел фрагмент кода из Интернета с помощью C#, но у меня есть некоторые сомнения по поводу этого кода. Вы можете мне помочь?Что такое использование скелета, период жестов в приложении Kinect?
Код:
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();
}
}
}
}
Кроме того, существует класс Жест, который проверяет волновые функции:
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, но я запутался о функциях жест. Мои вопросы следующие:
- Почему они создают Скелетную историю?
- Что необходимо для жестовПериод и индексыПерсекунд?
- Почему они проверяют (m_SkeletonHistory.Count> indexesToCheck)?
- Можете ли вы объяснить функцию вибрации?
так в этой концепции является то, что 'gesturePeriod, indexesPerSecond = 30; indexesToCheck = gesturePeriod * indexesPerSecond; '? и 0,1 и 0,2F refdistance? – user39320
@ user39320 Обновленный ответ там, чтобы отразить комментарий –
@ Robben_Ford_Fan_boy спасибо .. и у меня есть еще одно сомнение в том, что я использую волну, почему кодер использует 'Joints [JointType.HandLeft] .Position'? что такое ось X и Y? любой полезный документ для этой оси? также в чем важность 'startPos = localSkeletonHistory [0] .Joints [JointType.HandLeft] .Position.X;'? – user39320