これは、いくつかの計算を含むポイントを記録するために使用するコードです。そうです、ポイントの値の場所を取得し、計算を行ってから、それらをリストに保存します。
gesture.L.E.AddFrameDescriptor(
joints[JointType.ElbowLeft].Position.X, joints[JointType.ElbowLeft].Position.Y, joints[JointType.ElbowLeft].Position.Z,
joints[JointType.SpineMid].Position.X, joints[JointType.SpineMid].Position.Y, joints[JointType.SpineMid].Position.Z,
spineBaseShoulderRHO
);
gesture.L.W.AddFrameDescriptor(
joints[JointType.WristLeft].Position.X, joints[JointType.WristLeft].Position.Y, joints[JointType.WristLeft].Position.Z,
joints[JointType.SpineMid].Position.X, joints[JointType.SpineMid].Position.Y, joints[JointType.SpineMid].Position.Z,
spineBaseShoulderRHO
);
gesture.L.H.AddFrameDescriptor(
joints[JointType.HandTipLeft].Position.X, joints[JointType.HandTipLeft].Position.Y, joints[JointType.HandTipLeft].Position.Z,
joints[JointType.SpineMid].Position.X, joints[JointType.SpineMid].Position.Y, joints[JointType.SpineMid].Position.Z,
spineBaseShoulderRHO
);
gesture.R.E.AddFrameDescriptor(
joints[JointType.ElbowRight].Position.X, joints[JointType.ElbowRight].Position.Y, joints[JointType.ElbowRight].Position.Z,
joints[JointType.SpineMid].Position.X, joints[JointType.SpineMid].Position.Y, joints[JointType.SpineMid].Position.Z,
spineBaseShoulderRHO
);
gesture.R.W.AddFrameDescriptor(
joints[JointType.WristRight].Position.X, joints[JointType.WristRight].Position.Y, joints[JointType.WristRight].Position.Z,
joints[JointType.SpineMid].Position.X, joints[JointType.SpineMid].Position.Y, joints[JointType.SpineMid].Position.Z,
spineBaseShoulderRHO
);
gesture.R.H.AddFrameDescriptor(
joints[JointType.HandTipRight].Position.X, joints[JointType.HandTipRight].Position.Y, joints[JointType.HandTipRight].Position.Z,
joints[JointType.SpineMid].Position.X, joints[JointType.SpineMid].Position.Y, joints[JointType.SpineMid].Position.Z,
spineBaseShoulderRHO
);
何らかの理由で、20回ほど繰り返される多くの値が繰り返されます。単一の値のみを保存すると、重要な値が得られ、繰り返しがなくなります。さらに、値の差は、0.05513 と 0.05413 のように互いに非常に近くなります。 20 0.05013 です。
編集リストに複数の値を保存した場合に得られるサンプル値は次のとおりです。
0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.399695181 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401078759 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401423597 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625 0.401669625
ご覧のとおり、数字は 20 回ほど繰り返されています。
拡張コード
private void DrawBody(IReadOnlyDictionary<JointType, Joint> joints, IDictionary<JointType, Point> jointPoints, DrawingContext drawingContext, Pen drawingPen)
{
foreach (var bone in this.bones)
{
this.DrawBone(joints, jointPoints, bone.Item1, bone.Item2, drawingContext, drawingPen);
}
foreach (JointType jointType in joints.Keys)
{
if (!(jointType.Equals(JointType.HandLeft) || jointType.Equals(JointType.HandRight) || jointType.Equals(JointType.ThumbLeft) || jointType.Equals(JointType.ThumbRight)))
{
Brush drawBrush = null;
TrackingState trackingState = joints[jointType].TrackingState;
if (trackingState == TrackingState.Tracked)
{
drawBrush = this.trackedJointBrush;
check.Add(joints[JointType.ElbowLeft].Position.X);
if (this.status_active)
{
if (!this.status_ready && (new MathFunctions().GetDist2P(joints[JointType.HandTipLeft].Position.X, joints[JointType.HandTipRight].Position.X) <= 0.03 && joints[JointType.HandTipLeft].Position.Y < joints[JointType.SpineMid].Position.Y && joints[JointType.HandTipRight].Position.Y < joints[JointType.SpineMid].Position.Y))
{
lbl_status.Content = "READY"; lbl_status.Foreground = Brushes.Green; ellps_status.Fill = Brushes.Green;
this.status_ready = true;
}
else if (this.status_ready)
{
if (!this.status_recording && (joints[JointType.HandTipLeft].Position.Y > joints[JointType.SpineBase].Position.Y || joints[JointType.HandTipRight].Position.Y > joints[JointType.SpineBase].Position.Y))
{
lbl_status.Content = "RECORDING"; lbl_status.Foreground = Brushes.Red; ellps_status.Fill = Brushes.Red;
this.status_recording = true;
this.gesture = new Gesture();
spineBaseShoulderRHO = new MathFunctions().GetRho(
new MathFunctions().GetDist2P(joints[JointType.SpineBase].Position.X, joints[JointType.SpineShoulder].Position.X),
new MathFunctions().GetDist2P(joints[JointType.SpineBase].Position.Y, joints[JointType.SpineShoulder].Position.Y),
new MathFunctions().GetDist2P(joints[JointType.SpineBase].Position.Z, joints[JointType.SpineShoulder].Position.Z)
);
}
else if (status_recording)
{
if (joints[JointType.HandTipLeft].Position.Y < joints[JointType.SpineBase].Position.Y && joints[JointType.HandTipRight].Position.Y < joints[JointType.SpineBase].Position.Y)
{
lbl_status.Content = "ACTIVE"; lbl_status.Foreground = Brushes.Black; ellps_status.Fill = Brushes.Black;
this.status_active = true;
this.status_ready = false;
this.status_recording = false;
gesture = new SLFunctions().RemoveRedundantPoints(gesture);
// identify gesture
if (tbox_word.Text == "")
{
SimilarityIndex minIndex = new SLFunctions().IdentifyGesture(library, gesture);
lbl_word.Content = minIndex.gestureName;
}
// new gesture
else
{
gesture.name = tbox_word.Text;
new SLFunctions().SaveGesture(gesture, "library");
library.Add(gesture);
tbox_word.Text = "";
}
}
#region AddFrameDescriptor
gesture.L.E.AddFrameDescriptor(
joints[JointType.ElbowLeft].Position.X, joints[JointType.ElbowLeft].Position.Y, joints[JointType.ElbowLeft].Position.Z,
joints[JointType.SpineMid].Position.X, joints[JointType.SpineMid].Position.Y, joints[JointType.SpineMid].Position.Z,
spineBaseShoulderRHO
);
gesture.L.W.AddFrameDescriptor(
joints[JointType.WristLeft].Position.X, joints[JointType.WristLeft].Position.Y, joints[JointType.WristLeft].Position.Z,
joints[JointType.SpineMid].Position.X, joints[JointType.SpineMid].Position.Y, joints[JointType.SpineMid].Position.Z,
spineBaseShoulderRHO
);
gesture.L.H.AddFrameDescriptor(
joints[JointType.HandTipLeft].Position.X, joints[JointType.HandTipLeft].Position.Y, joints[JointType.HandTipLeft].Position.Z,
joints[JointType.SpineMid].Position.X, joints[JointType.SpineMid].Position.Y, joints[JointType.SpineMid].Position.Z,
spineBaseShoulderRHO
);
gesture.R.E.AddFrameDescriptor(
joints[JointType.ElbowRight].Position.X, joints[JointType.ElbowRight].Position.Y, joints[JointType.ElbowRight].Position.Z,
joints[JointType.SpineMid].Position.X, joints[JointType.SpineMid].Position.Y, joints[JointType.SpineMid].Position.Z,
spineBaseShoulderRHO
);
gesture.R.W.AddFrameDescriptor(
joints[JointType.WristRight].Position.X, joints[JointType.WristRight].Position.Y, joints[JointType.WristRight].Position.Z,
joints[JointType.SpineMid].Position.X, joints[JointType.SpineMid].Position.Y, joints[JointType.SpineMid].Position.Z,
spineBaseShoulderRHO
);
gesture.R.H.AddFrameDescriptor(
joints[JointType.HandTipRight].Position.X, joints[JointType.HandTipRight].Position.Y, joints[JointType.HandTipRight].Position.Z,
joints[JointType.SpineMid].Position.X, joints[JointType.SpineMid].Position.Y, joints[JointType.SpineMid].Position.Z,
spineBaseShoulderRHO
);
#endregion
}
}
}
}
else if (trackingState == TrackingState.Inferred)
{
drawBrush = this.inferredJointBrush;
}
if (drawBrush != null)
{
drawingContext.DrawEllipse(drawBrush, null, jointPoints[jointType], JointThickness, JointThickness);
}
}
}
}