ใครมี idea ในการใช้ kinect ดีๆบ้าง

เริ่มโดย bonshington, 22 พฤศจิกายน 2011, 22:46:38

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

bonshington

เนื่องจากตอนนี้ 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 ที่เท้า ตอนนี้มันเลยอ่านมือปัดซ้าย ปัดขวา อ่านออกบ้างไม่ออกบ้าง
ไว้เด๋วแก้เป็นอ่านแม่มทุกจุด

TUMZA

โอ้ว พี่ผมซื้อเล่นอยู่ครับ เดี๋ยวเอาไปบอกพี่ผม   พอดีพวกผมชมรมทำหุ่นยนต์ สนใจพวกนี้อยู่ครับ เกี่ยวกับ Image Processing  :wanwan019:
[direct=https://voice.botnoi.ai/]>>>AI พูดไทย Botnoi ใส่รหัส 30bot ได้ point เพิ่ม 30% <<<[/direct]

bonshington

#2
อ้างถึงจาก: TUMZA ใน 22 พฤศจิกายน 2011, 22:52:02
โอ้ว พี่ผมซื้อเล่นอยู่ครับ เดี๋ยวเอาไปบอกพี่ผม   พอดีพวกผมชมรมทำหุ่นยนต์ สนใจพวกนี้อยู่ครับ เกี่ยวกับ Image Processing  :wanwan019:
เหมือนว่า พวก depth stream, image stream มันยังไม่สมบูรณ์นะ เพราะ beta อยู่