私は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の機能を理解することができますが、私はジェスチャー機能について混乱しています。私の質問は以下の通りです:
- なぜ彼らはスケルトンヒストリーを作成しますか?
- gesturePeriodとindexesPerSecondの必要性は何ですか?
- なぜ(m_SkeletonHistory.Count> indexesToCheck)がチェックされますか?
- waveright関数について説明できますか?
ので、この概念に 'gesturePeriod、indexesPerSecond = 30は何ですかindexesToCheck = gesturePeriod * indexesPerSecond; '? 0.1と0.2Fの屈折率? – user39320
@ user39320コメントは –
@ Robben_Ford_Fan_boyありがとうございました。私はそれを疑う余地があります。私はwaverightを実装しています。なぜコーダーは 'Joints [JointType.HandLeft] .Position'を使うのですか? X&Y軸とは何ですか?この軸のための有用な文書? 'startPos = localSkeletonHistory [0] .Joints [JointType.HandLeft] .Position.X;の重要性は何ですか? – user39320