необработанные данные о глубине в текст kinect v1.0 C#

Я искал в Интернете, и мне не повезло. Я использую Xbox Kinect с Kinect SDK v1.0. Я хочу взять необработанные данные о глубине и преобразовать их в текстовый документ, чтобы использовать данные о глубине. Я нашел кое-что на этом сайте, но это было для Beta2, и мне нужно использовать v1.0. Любая помощь приветствуется, но я новичок в кодировании, поэтому лучше всего подойдет пример кода.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Kinect;
using System.Diagnostics;
using System.IO;

namespace DepthTextStream
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    const float MaxDepthDistance = 4095; // max value returned
    const float MinDepthDistance = 850; // min value returned
    const float MaxDepthDistanceOffset = MaxDepthDistance - MinDepthDistance;

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        kinectSensorChooser1.KinectSensorChanged += new DependencyPropertyChangedEventHandler(kinectSensorChooser1_KinectSensorChanged);

    }

    void kinectSensorChooser1_KinectSensorChanged(object sender, DependencyPropertyChangedEventArgs e)
    {

        var oldSensor = (KinectSensor)e.OldValue;

        //stop the old sensor
        if (oldSensor != null)
        {
            oldSensor.Stop();
            oldSensor.AudioSource.Stop();
        }

        //get the new sensor
        var newSensor = (KinectSensor)e.NewValue;
        if (newSensor == null)
        {
            return;
        }

        //turn on features that you need
        newSensor.DepthStream.Enable(DepthImageFormat.Resolution320x240Fps30);
        newSensor.SkeletonStream.Enable(); 

        //sign up for events if you want to get at API directly
        newSensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(newSensor_AllFramesReady);


        try
        {
            newSensor.Start();
        }
        catch (System.IO.IOException)
        {
            //this happens if another app is using the Kinect
            kinectSensorChooser1.AppConflictOccurred();
        }
    }

    void newSensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
    {
        short[] depthData;

        using (DepthImageFrame depthFrame = e.OpenDepthImageFrame()) //create a new frame every time one is ready
    {
    //assign a value to depthData
    depthData = new short[depthFrame.PixelDataLength];
    } 

    }


    private void SaveDepthData(short[] depthData)
    {
        //initialize a StreamWriter
        StreamWriter sw = new StreamWriter(@"C:/Example.txt");

        //search the depth data and add it to the file
        for (int i = 0; i < depthData.Length; i++)
        {
            sw.WriteLine(depthData[i] + "\n"); //\n for a new line
        }

        //dispose of sw
        sw.Close();
        SaveDepthData(depthData);
    }      

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        StopKinect(kinectSensorChooser1.Kinect); 
    }

    private void StopKinect(KinectSensor sensor)
    {
        if (sensor != null)
        {
            if (sensor.IsRunning)
            {
                //stop sensor 
                sensor.Stop();

                //stop audio if not null
                if (sensor.AudioSource != null)
                {
                    sensor.AudioSource.Stop();
                }
            }
        }
    } 
}

}


person Sean Morrison    schedule 30.07.2012    source источник
comment
Версия 1.0? Почему не 1.5.0.1?   -  person Liam McInroy    schedule 30.07.2012
comment
Зачем вам нужно добавлять его в текстовый файл?   -  person Liam McInroy    schedule 30.07.2012


Ответы (1)


Это довольно просто с использованием версии 1.5.0.1, которая практически совпадает с версией 1.0 и будет работать с ней. Все, что вам нужно для этого, это A)a short[] для хранения данных о глубине B)a DepthImageFrame для перемещения данных в массив и C)A StreamWriter для сохранения данных.

Добавьте short[] для хранения данных о глубине, а внутри DepthFrameReadyEventArgs (или AllFramesReadyEventArgs) вы «используете» DepthImageFrame, выполнив:

 short[] depthData;

 ...

 using (DepthImageFrame depthFrame = e.OpenDepthImageFrame(()) //create a new frame every time one is ready
 {
       //assign a value to depthData
       depthData = new short[depthFrame.PixelDataLength];
 } 

Затем вы можете добавить глубину каждого кадра к depthData, используя DepthImageFrame.CopyPixelDataTo

 using (DepthImageFrame depthFrame = e.OpenDepthImageFrame(()) //create a new frame every time one is ready
 {
       //assign a value to depthData
       depthData = new short[depthFrame.PixelDataLength];

       //add raw depth data to depthData
       depthFrame.CopyPixelDataTo(depthData);
 } 

Затем мы можем написать метод для сохранения наших данных с помощью файла StreamWriter.

 private void SaveDepthData(short[] depthData)
 {
       //initialize a StreamWriter
       StreamWriter sw = new StreamWriter(@"C:/Example.txt");

       //search the depth data and add it to the file
       for (int i = 0; i < depthData.Length; i++)
       {
            sw.WriteLine(depthData[i] + "\n"); //\n for a new line
       }

       //dispose of sw
       sw.Close();
 }      

 ...

 SaveDepthData(depthData);

Надеюсь это поможет!

person Liam McInroy    schedule 31.07.2012
comment
Извините, я не смогу помочь в ближайшие несколько дней, так как буду в походе :) - person Liam McInroy; 31.07.2012
comment
@Outlaw_Lemur Я взял свой предыдущий код, большую часть которого я получил из учебника, отредактировал его и добавил то, что вы мне дали. Я получаю сообщение об ошибке, когда добавляю стримрайтер. Есть ли ссылка, которую мне нужно добавить? Кроме того, куда отправляется то, что я сохраняю. В (@C:/Example.txt);? - person Sean Morrison; 31.07.2012
comment
Добавить с помощью System.IO; наверх для StreamWriter. И да, в его примере все данные будут сохранены в C:/Example.txt. - person Jerdak; 01.08.2012
comment
Когда я добавил все, я не получаю ошибок, но когда я запускаю его, возникает необработанное исключение NullReferenceException. Я опубликую свой код ниже. Может ли кто-нибудь сказать мне, где моя ошибка? - person Sean Morrison; 01.08.2012