2015-10-01 167 views
2

我想救我的Kinect的原始深度數據,我不希望使用Kinect的工作室,因爲我需要的原始數據進行進一步的計算。我正在使用kinectv2和kinect sdk!保存原始detph數據

我的問題是,我只是得到低FPS爲所保存的數據。其約15-17FPS。

這裏我Framereader(在進一步的措施,我想保存colorstream也):

frameReader = kinectSensor.OpenMultiSourceFrameReader(FrameSourceTypes.Depth); 
frameReader.MultiSourceFrameArrived += Reader_MultiSourceFrameArrived; 

這裏事件:

void Reader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e) 
{ 
    var reference = e.FrameReference.AcquireFrame(); 
    saveFrameTest(reference); 
    frame_num++; 
} 

這裏的節能功能:

private unsafe void saveFrameTest(Object reference) 
{ 
    MultiSourceFrame mSF = (MultiSourceFrame)reference; 

    using (var frame = mSF.DepthFrameReference.AcquireFrame()) 
    { 
     if (frame != null) 
     { 
      using (Microsoft.Kinect.KinectBuffer depthBuffer = frame.LockImageBuffer()) 
      { 
       if ((frame.FrameDescription.Width * frame.FrameDescription.Height) == (depthBuffer.Size/frame.FrameDescription.BytesPerPixel)) 
       { 
        ushort* frameData = (ushort*)depthBuffer.UnderlyingBuffer; 
        byte[] rawDataConverted = new byte[(int)(depthBuffer.Size/2)]; 

        for (int i = 0; i < (int)(depthBuffer.Size/2); ++i) 
        { 
         ushort depth = frameData[i]; 
         rawDataConverted[i] = (byte)(depth >= frame.DepthMinReliableDistance && depth <= frame.DepthMaxReliableDistance ? (depth) : 0); 
        } 

        String date = string.Format("{0:hh-mm-ss}", DateTime.Now); 
        String filePath = System.IO.Directory.GetCurrentDirectory() + "/test/" +date+".raw"; 
        File.WriteAllBytes(filePath, rawDataConverted); 
        rawDataConverted = null; 

       } 
      } 
     } 
    } 
} 

另外Infomration: 我包括我的上INTE一個簡單的控制檯應用代碼l®Xeon®處理器E5-1620 3.7 GHz,16 GB RAM。

我認爲for循環正在向多的時間:

for (int i = 0; i < (int)(depthBuffer.Size/2); ++i) 
         { 
          ushort depth = frameData[i]; 
          rawDataConverted[i] = (byte)(depth >= frame.DepthMinReliableDistance && depth <= frame.DepthMaxReliableDistance ? (depth) : 0); 
         } 

我可以提高我的幀率。現在,我正在直接訪問kinectbuffer並退出for循環。

Microsoft.Kinect.KinectBuffer depthBuffer = frame.LockImageBuffer(); 

Marshal.Copy(depthBuffer.UnderlyingBuffer, rawData_depth, 0, (depthImageSize)); 

depthBuffer.Dispose(); 
frame.Dispose(); 

但我無法獲得30FPS率。現在它大約是25 FPS。

+0

在保存後如何進一步使用原始保存的數據? –

+0

不應該'私人不安全無效saveFrameTest(對象引用)'是'私有靜態不安全無效saveFrameTest(對象引用)'?即不應該添加「靜態」? –

+0

'startTime'的數據類型是什麼? 'TimeSpan'? –

回答

0

你可以嘗試這樣的事情讓你的陣列。 這是我通常使用的。

var frame = frameReference.AcquireFrame(); 
var frameDescription = frame.FrameDescription; 
ushort[] frameData = new ushort[frameDescription.Width * frameDescription.Height]; 
frame.CopyFrameDataToArray(frameData);