เนื่องจากตอนนี้ ms ออก kinect sdk ออกมาแล้ว ซึ่ง ลองเล่น + hack แล้วหนุกหนานอยู่ เลยอยากได้ไอเดียขำๆ ในการใช้ kinect คับ
เท่าที่คิดออกตอนนี้มี
- โปรแกรมเปลี่ยนช่อง youtube โดนใช้มือหรือเท้า
เนื่องมาจากขี้เกียจหารีโมทตอนกลางคืน เลยกะว่า เอาตีนเขี่ยๆ เปลี่ยนทีวี หรือช่อง youtube
- โปรแกรมแต่งหน้า แต่งตัวขำๆ
ตรวจจับว่า ลำตัวอยู่ประมาณไหน แล้วก็เอารูปบิกินี ไปแปะทับ หรือ หรือเอาอะไรขำๆไปแปะ แต่คิดว่าไม่เวิร์ค เพราะเวปแคมธรรมดาก็ใช้ได้
เอา source มาแชร์ขำๆเผื่อใครอยากหัดเขียน เขียนต่อเติมจากตัว SkeletalViewer
private void Window_Loaded(object sender, EventArgs e)
{
if (minKinectCount > 0)
{
kinectRequiredOrEnabled.Text = "Requires Kinect";
}
else
{
kinectRequiredOrEnabled.Text = "Kinect Enabled";
}
//Watch for Kinects connecting, disconnecting - and gracefully handle them.
Runtime.Kinects.StatusChanged += new EventHandler<StatusChangedEventArgs>(Kinects_StatusChanged);
Runtime.Kinects[0].SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(MainWindow_SkeletonFrameReady);
//create a KinectViewer for each Kinect that is found.
CreateAllKinectViewers();
}
อันนี้เป็นตัว trap movement ทั้งหมด
void MainWindow_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
SkeletonFrame allSkeletons = e.SkeletonFrame;
SkeletonData skeleton = (from s in allSkeletons.Skeletons
where s.TrackingState == SkeletonTrackingState.Tracked
select s).FirstOrDefault();
if(skeleton != null)
{
var frontMostJoint = skeleton.Joints.OfType<Joint>().OrderBy(j => j.Position.Z).First();
//this.label1.Content = tracking.Joint.Position.Delta(frontMostJoint.Position);
if(tracking == null)
{
tracking = new GestureRecognition(frontMostJoint);
}
if(frontMostJoint.ID != tracking.Joint.ID)
{
tracking =frontMostJoint.Gesture();
}
else if(!tracking.Recognised && tracking.Joint.Position.Delta(frontMostJoint.Position) > GestureRecognition.MOVEMENT_TRESHOLD)
{
previousRecognised = new GestureRecognition(frontMostJoint);
tracking.Recognised = true;
this.label1.Content = tracking.RecognisedMovement(frontMostJoint).ToString();
}
else if(tracking.Recognised && previousRecognised.Since.Subtract(tracking.Since).Milliseconds > IGNORING_RECOGNISED_JOINT_MS)
{
tracking = null;
}
this.Tracking.Content = tracking.Joint.ID.ToString();
this.Detect.Content = frontMostJoint.ID.ToString();
}
}
อันนี้ตัวแปรเสริม joint ต่างๆ
public class GestureRecognition
{
public const float MOVEMENT_TRESHOLD = 0.2f;
public DateTime Since { get; private set; }
public bool Recognised { get; set; }
public Joint Joint { get; private set; }
public GestureRecognition(Joint joint)
{
this.Joint = joint;
this.Since = DateTime.Now;
this.Recognised = false;
}
}
public enum Movement
{
none = 0,
left = 1,
right = 2,
up = 4,
down = 8,
front = 16,
back = 32
}
method เพิ่มเติม
public static class Helper
{
public static float Delta(this Vector origin, Vector current)
{
return (float)Math.Sqrt(
Math.Pow(current.X - origin.X, 2d) +
Math.Pow(current.Y - origin.Y, 2d) +
Math.Pow(current.Z - origin.Z, 2d)
);
}
public static Movement RecognisedMovement(this GestureRecognition origin, Joint current)
{
Movement result = Movement.none;
if(Math.Abs(current.Position.X - origin.Joint.Position.X) > GestureRecognition.MOVEMENT_TRESHOLD)
result = result | ((origin.Joint.Position.X > current.Position.X)? Movement.left : Movement.right);
return result;
}
public static GestureRecognition Gesture(this Joint joint)
{
return new GestureRecognition(joint);
}
}
code ยังกากอยู่ เขียน + อ่าน doc มาได้ ชม นึงละ
ตัว code เขียนให้ดูเฉพาะจุดที่ใกล้ kinect ที่สุด มันเลยมีปัญหาตรงที่มันจะจับทีละจุดเช่นเวลายืนตรง บางทีมันจะอ่านว่าเท้าอยู่ใกล้สุด มันก็จะ track ที่เท้า ตอนนี้มันเลยอ่านมือปัดซ้าย ปัดขวา อ่านออกบ้างไม่ออกบ้าง
ไว้เด๋วแก้เป็นอ่านแม่มทุกจุด