2012-07-30 4 views
0

나는 인터넷을 검색해 왔으며 나는 운이 없었습니다. Xbox Kinect를 Kinect SDK v1.0과 함께 사용하고 있습니다. 원본 깊이 데이터를 가져 와서 텍스트 문서로 변환하여 깊이 데이터를 사용할 수 있습니다. 이 사이트에서 뭔가를 찾았지만 Beta2에 대한 것이었고 v1.0을 사용해야합니다. 어떤 도움을 주셔서 감사하지만 나는 코딩에 익숙하지 않으므로 샘플 코드가 최상일 것입니다.원시 깊이 데이터를 텍스트로 변환 kinect v1.0 C#

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(); 
       } 
      } 
     } 
    } 
} 

}

+0

버전 1.0? 왜 1.5.0.1이 아니겠습니까? –

+0

왜 텍스트 파일에 추가해야합니까? –

답변

4

실질적으로 버전 1.0과 동일하며 그것을 작동 버전 1.5.0.1을 사용하여 매우 간단하다. 이것을 완료하는 데 필요한 것은 A) 깊이 데이터를 보유하는 short[] B) DepthImageFrame을 사용하여 데이터를 배열로 이동하고 C) StreamWriter을 사용하여 데이터를 저장합니다.

는 깊이 데이터를 저장하는 short[]을 추가하고 내부 사용자의 DepthFrameReadyEventArgs (또는 AllFramesReadyEventArgs) 당신은 DepthImageFrame 수행하여 "사용"그럼 당신은 사용 depthData에 각 프레임에서 깊이를 추가 할 수 있습니다

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]; 
} 

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); 

희망이 있습니다.

+0

죄송합니다. 앞으로 며칠 동안 캠핑에 도움이되지 않을 것입니다. –

+0

@Outlaw_Lemur 제가 이전에 작성한 코드는 대부분 튜토리얼에서 가져 와서 편집하고 추가 한 내용을 추가했습니다. 스트림 작가를 추가 할 때 오류가 발생합니다. 추가해야 할 참조가 있습니까? 또한 나는 구원받는 사람을 보내고있다. 받는 사람에게 (@ "C : /Example.txt"); –

+2

"using System.IO;"를 추가하십시오. StreamWriter의 맨 위로 이동합니다. 그리고 네, 그의 예제에서 모든 데이터는 C로 저장됩니다 : /Example.txt – Jerdak