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 Windows.Kinect;
......@@ -6,19 +8,6 @@ namespace MotionAnalysis
{
public class DistItvExtractor
{
private CameraSpacePoint Head,
HandLeft,
HandRight,
SpineShoulder,
SpineMid,
ElbowLeft,
ElbowRight,
KneeLeft,
KneeRight,
SpineMidRecent,
HandLeftRecent,
HandRightRecent;
private Dictionary<string, CameraSpacePoint?> Points =
new Dictionary<string, CameraSpacePoint?>
{
......@@ -38,45 +27,45 @@ namespace MotionAnalysis
private float Table;
public float DistHandBaseSpineShoulder
public float? DistHandBaseSpineShoulder
{ get; private set; }
public float DistHand
public float? DistSpine
{ get; private set; }
public float DistSpine
public float? DistHandBaseHead
{ get; private set; }
public float DistHandBaseHead
public float? DistHandLeft
{ get; private set; }
public float DistHandLeft
public float? DistHandRight
{ get; private set; }
public float DistHandRight
public float? DistHandBaseElbow_Left
{ get; private set; }
public float DistHandBaseElbow_Left
public float? DistHandBaseElbow_Right
{ get; private set; }
public float DistHandBaseElbow_Right
public float? DistHandBaseHead_Left
{ get; private set; }
public float DistHandBaseHead_Left
public float? DistHandBaseHead_Right
{ get; private set; }
public float DistHandBaseHead_Right
public float? DistHandBaseSpineMid_Left
{ get; private set; }
public float DistHandBaseSpineMid_Left
public float? DistHandBaseSpineMid_Right
{ get; private set; }
public float DistHandBaseSpineMid_Right
public float? DistKneeBaseTable
{ get; private set; }
public float DistKneeBaseTable
public float? ItvHand
{ get; private set; }
public float ItvElbowBaseSpineMid_Left
public float? ItvElbowBaseSpineMid_Left
{ get; private set; }
public float ItvElbowBaseSpineMid_Right
public float? ItvElbowBaseSpineMid_Right
{ get; private set; }
public float ItvHandBaseHead
public float? ItvHandBaseHead
{ get; private set; }
public float ItvHandBaseHead_LeftEar
public float? ItvHandBaseHead_LeftEar
{ get; private set; }
public float ItvHandBaseHead_RightEar
public float? ItvHandBaseHead_RightEar
{ get; private set; }
public float ItvHandBaseHead_LeftDepth
public float? ItvHandBaseHead_LeftDepth
{ get; private set; }
public float ItvHandBaseHead_RightDepth
public float? ItvHandBaseHead_RightDepth
{ get; private set; }
public DistItvExtractor(float table)
......@@ -93,22 +82,18 @@ namespace MotionAnalysis
private void UpdatePosition(KinectModule.IBody body)
{
Head = body.Joints[JointType.Head] .Position;
HandLeft = body.Joints[JointType.HandLeft] .Position;
HandRight = body.Joints[JointType.HandRight] .Position;
SpineShoulder = body.Joints[JointType.SpineShoulder].Position;
SpineMid = body.Joints[JointType.SpineMid] .Position;
ElbowLeft = body.Joints[JointType.ElbowLeft] .Position;
ElbowRight = body.Joints[JointType.ElbowRight] .Position;
KneeLeft = body.Joints[JointType.KneeLeft] .Position;
KneeRight = body.Joints[JointType.KneeRight] .Position;
Points.Keys.Select(x => (JointType)Enum.Parse(typeof(JointType), x))
.ToList()
.ForEach(x => Points[x.ToString()] =
body.Joints.ContainsKey(x) ?
(CameraSpacePoint?)body.Joints[x].Position : null);
}
private void SaveRecent()
{
SpineMidRecent = SpineMid;
HandLeftRecent = HandLeft;
HandRightRecent = HandRight;
Points["SpineMidRecent"] = Points["SpineMid"];
Points["HandLeftRecent"] = Points["HandLeft"];
Points["HandRightRecent"] = Points["HandRight"];
}
private void UpdateDistItv()
......@@ -125,74 +110,252 @@ namespace MotionAnalysis
ComputeHeadphone();
}
bool PointsNotNull(string[] names)
{
foreach(var x in names)
if (Points[x] == null)
return false;
return true;
}
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()
{
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()
{
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()
{
DistHandLeft = HandLeft.Y - HandLeftRecent.Y;
DistHandRight = HandRight.Y - HandRightRecent.Y;
if (!PointsNotNull(new string[]
{
"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()
{
DistHandBaseElbow_Left = HandLeft.Y - ElbowLeft.Y;
DistHandBaseElbow_Right = HandRight.Y - ElbowRight.Y;
if (!PointsNotNull(new string[]
{
"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);
ItvElbowBaseSpineMid_Right = Mathf.Abs(ElbowRight.X - SpineMid.X);
return;
}
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()
{
DistHandBaseHead_Left = HandLeft.Y - Head.Y;
DistHandBaseHead_Right = HandRight.Y - Head.Y;
if (!PointsNotNull(new string[]
{
"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()
{
DistHandBaseSpineMid_Left = HandLeft.Y - SpineMid.Y;
DistHandBaseSpineMid_Right = HandRight.Y - SpineMid.Y;
if (!PointsNotNull(new string[]
{
"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()
{
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()
{
ItvHandBaseHead = Mathf.Min(Mathf.Abs(HandLeft.X - Head.X),
Mathf.Abs(HandRight.X - Head.X));
if (!PointsNotNull(new string[]
{
"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()
{
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);
}
if (!PointsNotNull(new string[]
{
"HandLeft",
"HandRight",
"Head"
}))
{
ItvHandBaseHead_LeftEar = null;
ItvHandBaseHead_RightEar = null;
ItvHandBaseHead_LeftDepth = null;
ItvHandBaseHead_RightDepth = null;
private float Distance(CameraSpacePoint a, CameraSpacePoint b)
{
return Mathf.Sqrt(Mathf.Pow(a.X - b.X, 2.0f) +
Mathf.Pow(a.Y - b.Y, 2.0f) +
Mathf.Pow(a.Z - b.Z, 2.0f));
return;
}
var handleft = Points["HandLeft"] .Value;
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
private void Clap()
{
const float distPrepare = 0.3f,
distDone = 0.1f;
const float itvPrepare = 0.3f,
itvDone = 0.1f;
if (Extractor.DistHandBaseSpineShoulder <= 0.0f)
return;
if (Extractor.DistHand > distPrepare)
if (Extractor.ItvHand > itvPrepare)
Motion |= MotionState.CLAP_PREPARE;
else if (Extractor.DistHand < distDone)
else if (Extractor.ItvHand < itvDone)
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