Използване на Kinect за изчисляване на изминатото разстояние

Опитвам се да разработя нещо, което изглежда като проста програма, която използва Kinect за Xbox360, за да изчисли разстоянието, изминато от човек. Стаята, към която ще бъде насочен Kinect, ще бъде 10 x 10. След като потребителят натисне бутона, обектът ще се движи в това пространство. След като обектът достигне крайната си дестинация в района, потребителят ще натисне бутона отново. След това Kinect ще изведе колко разстояние е изминал обектът между двете натискания на бутоните. Тъй като никога преди не е разработван за Kinect, беше доста обезсърчително да започнете. Проблемът ми е, че не съм напълно сигурен какво трябва да използвам за измерване на разстоянието. В моите изследвания открих начини да изчисля разстоянието, на което е даден обект ОТ Kinect, но това е всичко.


person TeegsD    schedule 31.05.2013    source източник
comment
Кой SDK използвате? OpenNI (1.54 или 2.0) или Kinect SDK?   -  person ArturSkowronski    schedule 02.06.2013
comment
Използвам KinectSDK   -  person TeegsD    schedule 03.06.2013


Отговори (1)


Това, което чухте, е прост въпрос за работа с декартова равнина. Kinect има 20 стави, които съществуват в пространството XYZ, а разстоянието се измерва в метри. За да получите достъп до тези съединения, имате тези изрази в клас "Tracker" (това е C#... не съм сигурен дали използвате C# или C++ в SDK):

public Tracker(KinectSensor sn, MainWindow win, string fileName)
        {
            window = win;

            sensor = sn;
            try
            {
                sensor.Start();
            }
            catch (IOException)
            {
                sensor = null;
                MessageBox.Show("No Kinect sensor found. Please connect one and restart the application", "*****ERROR*****");
                return;
            }

            sensor.SkeletonFrameReady += SensorSkeletonFrameReady;   //Frame handlers
            sensor.ColorFrameReady += SensorColorFrameReady;
            sensor.SkeletonStream.Enable();
            sensor.ColorStream.Enable();
        }

Те имат достъп до цветните и скелетните потоци от Kinect. Скелетният поток съдържа ставите, така че вие ​​се фокусирате върху това с тези твърдения:

//Start sending skeleton stream
        private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            //Access the skeleton frame
            using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
            {

                if (skeletonFrame != null)
                {
                    //Check to see if there is any data in the skeleton
                    if (this.skeletons == null)

                        //Allocate array of skeletons
                        this.skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];

                    //Copy skeletons from this frame
                    skeletonFrame.CopySkeletonDataTo(this.skeletons);

                    //Find first tracked skeleton, if any
                    Skeleton skeleton = this.skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault();
                    if (skeleton != null)
                    {
                        //Initialize joints
                        ///<summary>
                        ///Joints to be displayed, projected, recorded, etc.
                        ///</summary>
                        Joint leftFoot = skeleton.Joints[JointType.FootLeft];
                    }
                }

И така, в началото на вашата програма искате да изберете става (има 20... изберете такава, която ВИНАГИ ще е обърната към Kinect, когато изпълнявате програмата) и да получите нейното местоположение с нещо като следните изявления:

if(skeleton.Joints[JointType.FootLeft].TrackingState == JointTrackingState.Tracked)
{
    double xPosition = skeleton.Joints[JointType.FootLeft].Position.X;
    double yPosition = skeleton.Joints[JointType.FootLeft].Position.Y;
    double zPosition = skeleton.Joints[JointType.FootLeft].Position.Z;
}

В крайна сметка ще искате да имате малко забавяне, преди да спрете потока... известно време между щракването и когато изключите потока от Kinect. След това ще направите математиката, която трябва да направите, за да получите разстоянието между двете точки. Ако нямате забавяне, няма да можете да получите вашата декартова точка.

person nerdenator    schedule 05.06.2013