Использование 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