Commit f6672a4d authored by 16이상민's avatar 16이상민

Refactoring class "DistItvExtractor"

parent 79d8170b
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine; using UnityEngine;
using Windows.Kinect; using Windows.Kinect;
...@@ -6,19 +8,6 @@ namespace MotionAnalysis ...@@ -6,19 +8,6 @@ namespace MotionAnalysis
{ {
public class DistItvExtractor public class DistItvExtractor
{ {
private CameraSpacePoint Head,
HandLeft,
HandRight,
SpineShoulder,
SpineMid,
ElbowLeft,
ElbowRight,
KneeLeft,
KneeRight,
SpineMidRecent,
HandLeftRecent,
HandRightRecent;
private Dictionary<string, CameraSpacePoint?> Points = private Dictionary<string, CameraSpacePoint?> Points =
new Dictionary<string, CameraSpacePoint?> new Dictionary<string, CameraSpacePoint?>
{ {
...@@ -38,45 +27,45 @@ namespace MotionAnalysis ...@@ -38,45 +27,45 @@ namespace MotionAnalysis
private float Table; private float Table;
public float DistHandBaseSpineShoulder public float? DistHandBaseSpineShoulder
{ get; private set; } { get; private set; }
public float DistHand public float? DistSpine
{ get; private set; } { get; private set; }
public float DistSpine public float? DistHandBaseHead
{ get; private set; } { get; private set; }
public float DistHandBaseHead public float? DistHandLeft
{ get; private set; } { get; private set; }
public float DistHandLeft public float? DistHandRight
{ get; private set; } { get; private set; }
public float DistHandRight public float? DistHandBaseElbow_Left
{ get; private set; } { get; private set; }
public float DistHandBaseElbow_Left public float? DistHandBaseElbow_Right
{ get; private set; } { get; private set; }
public float DistHandBaseElbow_Right public float? DistHandBaseHead_Left
{ get; private set; } { get; private set; }
public float DistHandBaseHead_Left public float? DistHandBaseHead_Right
{ get; private set; } { get; private set; }
public float DistHandBaseHead_Right public float? DistHandBaseSpineMid_Left
{ get; private set; } { get; private set; }
public float DistHandBaseSpineMid_Left public float? DistHandBaseSpineMid_Right
{ get; private set; } { get; private set; }
public float DistHandBaseSpineMid_Right public float? DistKneeBaseTable
{ get; private set; } { get; private set; }
public float DistKneeBaseTable public float? ItvHand
{ get; private set; } { get; private set; }
public float ItvElbowBaseSpineMid_Left public float? ItvElbowBaseSpineMid_Left
{ get; private set; } { get; private set; }
public float ItvElbowBaseSpineMid_Right public float? ItvElbowBaseSpineMid_Right
{ get; private set; } { get; private set; }
public float ItvHandBaseHead public float? ItvHandBaseHead
{ get; private set; } { get; private set; }
public float ItvHandBaseHead_LeftEar public float? ItvHandBaseHead_LeftEar
{ get; private set; } { get; private set; }
public float ItvHandBaseHead_RightEar public float? ItvHandBaseHead_RightEar
{ get; private set; } { get; private set; }
public float ItvHandBaseHead_LeftDepth public float? ItvHandBaseHead_LeftDepth
{ get; private set; } { get; private set; }
public float ItvHandBaseHead_RightDepth public float? ItvHandBaseHead_RightDepth
{ get; private set; } { get; private set; }
public DistItvExtractor(float table) public DistItvExtractor(float table)
...@@ -93,22 +82,18 @@ namespace MotionAnalysis ...@@ -93,22 +82,18 @@ namespace MotionAnalysis
private void UpdatePosition(KinectModule.IBody body) private void UpdatePosition(KinectModule.IBody body)
{ {
Head = body.Joints[JointType.Head] .Position; Points.Keys.Select(x => (JointType)Enum.Parse(typeof(JointType), x))
HandLeft = body.Joints[JointType.HandLeft] .Position; .ToList()
HandRight = body.Joints[JointType.HandRight] .Position; .ForEach(x => Points[x.ToString()] =
SpineShoulder = body.Joints[JointType.SpineShoulder].Position; body.Joints.ContainsKey(x) ?
SpineMid = body.Joints[JointType.SpineMid] .Position; (CameraSpacePoint?)body.Joints[x].Position : null);
ElbowLeft = body.Joints[JointType.ElbowLeft] .Position;
ElbowRight = body.Joints[JointType.ElbowRight] .Position;
KneeLeft = body.Joints[JointType.KneeLeft] .Position;
KneeRight = body.Joints[JointType.KneeRight] .Position;
} }
private void SaveRecent() private void SaveRecent()
{ {
SpineMidRecent = SpineMid; Points["SpineMidRecent"] = Points["SpineMid"];
HandLeftRecent = HandLeft; Points["HandLeftRecent"] = Points["HandLeft"];
HandRightRecent = HandRight; Points["HandRightRecent"] = Points["HandRight"];
} }
private void UpdateDistItv() private void UpdateDistItv()
...@@ -125,74 +110,252 @@ namespace MotionAnalysis ...@@ -125,74 +110,252 @@ namespace MotionAnalysis
ComputeHeadphone(); ComputeHeadphone();
} }
bool PointsNotNull(string[] names)
{
foreach(var x in names)
if (Points[x] == null)
return false;
return true;
}
private void ComputeClap() private void ComputeClap()
{ {
DistHandBaseSpineShoulder = Mathf.Min(HandLeft.Y, HandRight.Y) - SpineShoulder.Y; if (!PointsNotNull(new string[]
{
"HandLeft",
"HandRight",
"SpineShoulder",
}))
{
DistHandBaseSpineShoulder = null;
ItvHand = null;
DistHand = Distance(HandLeft, HandRight); return;
}
var handleft = Points["HandLeft"] .Value;
var handright = Points["HandRight"] .Value;
var spineshoulder = Points["SpineShoulder"].Value;
DistHandBaseSpineShoulder = Mathf.Min(handleft.Y, handright.Y) - spineshoulder.Y;
ItvHand = Mathf.Sqrt(Mathf.Pow(handleft.X - handright.X, 2.0f) +
Mathf.Pow(handleft.Y - handright.Y, 2.0f) +
Mathf.Pow(handleft.Z - handright.Z, 2.0f));
} }
private void ComputeJump() private void ComputeJump()
{ {
DistSpine = SpineMid.Y - SpineMidRecent.Y; if (!PointsNotNull(new string[]
{
"SpineMid",
"SpineMidRecent"
}))
{
DistSpine = null;
return;
}
var spinemid = Points["SpineMid"] .Value;
var spinemidrecent = Points["SpineMidRecent"].Value;
DistSpine = spinemid.Y - spinemidrecent.Y;
} }
private void ComputeHurray() private void ComputeHurray()
{ {
DistHandBaseHead = Mathf.Min(HandLeft.Y, HandRight.Y) - Head.Y; if (!PointsNotNull(new string[]
{
"HandLeft",
"HandRight",
"Head"
}))
{
DistHandBaseHead = null;
return;
}
var handleft = Points["HandLeft"] .Value;
var handright = Points["HandRight"].Value;
var head = Points["Head"] .Value;
DistHandBaseHead = Mathf.Min(handleft.Y, handright.Y) - head.Y;
} }
private void ComputeHandMove() private void ComputeHandMove()
{ {
DistHandLeft = HandLeft.Y - HandLeftRecent.Y; if (!PointsNotNull(new string[]
DistHandRight = HandRight.Y - HandRightRecent.Y; {
"HandLeft",
"HandRight",
"HandLeftRecent",
"HandRightRecent"
}))
{
DistHandLeft = null;
DistHandRight = null;
return;
}
var handleft = Points["HandLeft"] .Value;
var handright = Points["HandRight"] .Value;
var handleftrecent = Points["HandLeftRecent"] .Value;
var handrightrecent = Points["HandRightRecent"].Value;
DistHandLeft = handleft.Y - handleftrecent.Y;
DistHandRight = handright.Y - handrightrecent.Y;
} }
private void ComputeGuardBase() private void ComputeGuardBase()
{ {
DistHandBaseElbow_Left = HandLeft.Y - ElbowLeft.Y; if (!PointsNotNull(new string[]
DistHandBaseElbow_Right = HandRight.Y - ElbowRight.Y; {
"HandLeft",
"HandRight",
"ElbowLeft",
"ElbowRight",
"SpineMid"
}))
{
DistHandBaseElbow_Left = null;
DistHandBaseElbow_Right = null;
ItvElbowBaseSpineMid_Left = null;
ItvElbowBaseSpineMid_Right = null;
ItvElbowBaseSpineMid_Left = Mathf.Abs(ElbowLeft.X - SpineMid.X); return;
ItvElbowBaseSpineMid_Right = Mathf.Abs(ElbowRight.X - SpineMid.X); }
var handleft = Points["HandLeft"] .Value;
var handright = Points["HandRight"] .Value;
var elbowleft = Points["ElbowLeft"] .Value;
var elbowright = Points["ElbowRight"].Value;
var spinemid = Points["SpineMid"] .Value;
DistHandBaseElbow_Left = handleft.Y - elbowleft.Y;
DistHandBaseElbow_Right = handright.Y - elbowright.Y;
ItvElbowBaseSpineMid_Left = Mathf.Abs(elbowleft.X - spinemid.X);
ItvElbowBaseSpineMid_Right = Mathf.Abs(elbowright.X - spinemid.X);
} }
private void ComputeHandUp() private void ComputeHandUp()
{ {
DistHandBaseHead_Left = HandLeft.Y - Head.Y; if (!PointsNotNull(new string[]
DistHandBaseHead_Right = HandRight.Y - Head.Y; {
"HandLeft",
"HandRight",
"Head"
}))
{
DistHandBaseHead_Left = null;
DistHandBaseHead_Right = null;
return;
}
var handleft = Points["HandLeft"] .Value;
var handright = Points["HandRight"].Value;
var head = Points["Head"] .Value;
DistHandBaseHead_Left = handleft.Y - head.Y;
DistHandBaseHead_Right = handright.Y - head.Y;
} }
private void ComputeHandDown() private void ComputeHandDown()
{ {
DistHandBaseSpineMid_Left = HandLeft.Y - SpineMid.Y; if (!PointsNotNull(new string[]
DistHandBaseSpineMid_Right = HandRight.Y - SpineMid.Y; {
"HandLeft",
"HandRight",
"SpineMid"
}))
{
DistHandBaseSpineMid_Left = null;
DistHandBaseSpineMid_Right = null;
return;
}
var handleft = Points["HandLeft"] .Value;
var handright = Points["HandRight"].Value;
var spinemid = Points["SpineMid"] .Value;
DistHandBaseSpineMid_Left = handleft.Y - spinemid.Y;
DistHandBaseSpineMid_Right = handright.Y - spinemid.Y;
} }
private void ComputeOnTheTable() private void ComputeOnTheTable()
{ {
DistKneeBaseTable = Mathf.Min(KneeLeft.Y, KneeRight.Y) - Table; if (!PointsNotNull(new string[]
{
"KneeLeft",
"KneeRight"
}))
{
DistKneeBaseTable = null;
return;
}
var kneeleft = Points["KneeLeft"] .Value;
var kneeright = Points["KneeRight"].Value;
DistKneeBaseTable = Mathf.Min(kneeleft.Y, kneeright.Y) - Table;
} }
private void ComputeJesus() private void ComputeJesus()
{ {
ItvHandBaseHead = Mathf.Min(Mathf.Abs(HandLeft.X - Head.X), if (!PointsNotNull(new string[]
Mathf.Abs(HandRight.X - Head.X)); {
"HandLeft",
"HandRight",
"Head"
}))
{
ItvHandBaseHead = null;
return;
}
var handleft = Points["HandLeft"] .Value;
var handright = Points["HandRight"].Value;
var head = Points["Head"] .Value;
ItvHandBaseHead = Mathf.Min(Mathf.Abs(handleft.X - head.X),
Mathf.Abs(handright.X - head.X));
} }
private void ComputeHeadphone() private void ComputeHeadphone()
{ {
ItvHandBaseHead_LeftEar = Mathf.Abs(HandLeft.X - Head.X); if (!PointsNotNull(new string[]
ItvHandBaseHead_RightEar = Mathf.Abs(HandRight.X - Head.X); {
ItvHandBaseHead_LeftDepth = Mathf.Abs(HandLeft.Z - Head.Z); "HandLeft",
ItvHandBaseHead_RightDepth = Mathf.Abs(HandRight.Z - Head.Z); "HandRight",
} "Head"
}))
{
ItvHandBaseHead_LeftEar = null;
ItvHandBaseHead_RightEar = null;
ItvHandBaseHead_LeftDepth = null;
ItvHandBaseHead_RightDepth = null;
private float Distance(CameraSpacePoint a, CameraSpacePoint b) return;
{ }
return Mathf.Sqrt(Mathf.Pow(a.X - b.X, 2.0f) +
Mathf.Pow(a.Y - b.Y, 2.0f) + var handleft = Points["HandLeft"] .Value;
Mathf.Pow(a.Z - b.Z, 2.0f)); var handright = Points["HandRight"].Value;
var head = Points["Head"] .Value;
ItvHandBaseHead_LeftEar = Mathf.Abs(handleft.X - head.X);
ItvHandBaseHead_RightEar = Mathf.Abs(handright.X - head.X);
ItvHandBaseHead_LeftDepth = Mathf.Abs(handleft.Z - head.Z);
ItvHandBaseHead_RightDepth = Mathf.Abs(handright.Z - head.Z);
} }
} }
} }
\ No newline at end of file
...@@ -72,15 +72,15 @@ namespace MotionAnalysis ...@@ -72,15 +72,15 @@ namespace MotionAnalysis
private void Clap() private void Clap()
{ {
const float distPrepare = 0.3f, const float itvPrepare = 0.3f,
distDone = 0.1f; itvDone = 0.1f;
if (Extractor.DistHandBaseSpineShoulder <= 0.0f) if (Extractor.DistHandBaseSpineShoulder <= 0.0f)
return; return;
if (Extractor.DistHand > distPrepare) if (Extractor.ItvHand > itvPrepare)
Motion |= MotionState.CLAP_PREPARE; Motion |= MotionState.CLAP_PREPARE;
else if (Extractor.DistHand < distDone) else if (Extractor.ItvHand < itvDone)
Motion |= MotionState.CLAP_DONE; Motion |= MotionState.CLAP_DONE;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment