ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์Programmingใครมี idea ในการใช้ kinect ดีๆบ้าง
หน้า: [1]   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: ใครมี idea ในการใช้ kinect ดีๆบ้าง  (อ่าน 1100 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
bonshington
ก๊วนเสียว
*

พลังน้ำใจ: 47
ออฟไลน์ ออฟไลน์

กระทู้: 376



ดูรายละเอียด
« เมื่อ: 22 พฤศจิกายน 2011, 22:46:38 »

เนื่องจากตอนนี้ 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 ที่เท้า ตอนนี้มันเลยอ่านมือปัดซ้าย ปัดขวา อ่านออกบ้างไม่ออกบ้าง
ไว้เด๋วแก้เป็นอ่านแม่มทุกจุด
« แก้ไขครั้งสุดท้าย: 22 พฤศจิกายน 2011, 22:47:57 โดย bonshington » บันทึกการเข้า
TUMZA
Verified Seller
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 203
ออฟไลน์ ออฟไลน์

กระทู้: 1,854



ดูรายละเอียด
« ตอบ #1 เมื่อ: 22 พฤศจิกายน 2011, 22:52:02 »

โอ้ว พี่ผมซื้อเล่นอยู่ครับ เดี๋ยวเอาไปบอกพี่ผม   พอดีพวกผมชมรมทำหุ่นยนต์ สนใจพวกนี้อยู่ครับ เกี่ยวกับ Image Processing  wanwan019
บันทึกการเข้า

bonshington
ก๊วนเสียว
*

พลังน้ำใจ: 47
ออฟไลน์ ออฟไลน์

กระทู้: 376



ดูรายละเอียด
« ตอบ #2 เมื่อ: 22 พฤศจิกายน 2011, 22:56:01 »

โอ้ว พี่ผมซื้อเล่นอยู่ครับ เดี๋ยวเอาไปบอกพี่ผม   พอดีพวกผมชมรมทำหุ่นยนต์ สนใจพวกนี้อยู่ครับ เกี่ยวกับ Image Processing  wanwan019
เหมือนว่า พวก depth stream, image stream มันยังไม่สมบูรณ์นะ เพราะ beta อยู่
« แก้ไขครั้งสุดท้าย: 22 พฤศจิกายน 2011, 22:56:20 โดย bonshington » บันทึกการเข้า
หน้า: [1]   ขึ้นบน
พิมพ์