2017-06-08 39 views
1

我想開發一個基於Kinect v2的軟件,我需要將捕獲的幀保存在一個數組中。我有一個問題,我沒有任何關於它的想法如下。在一個數組中保存kinect v2幀

捕獲的幀由我的處理類處理,處理後的可寫位圖將被稱爲我的UI窗口中的圖像盒的源,它完美地工作,我在我的UI中有一個實時幀。 例如:

/// Color 
_ProcessingInstance.ProcessColor(colorFrame); 
ImageBoxRGB.Source = _ProcessingInstance.colorBitmap; 

但是當我想這個分配給數組的一個元素,所有在數組中的元素將是作爲第一幀相同!!我應該提到的是,這個行動是在上面的行動在那裏的閱讀事件。 代碼:

ColorFrames_Array[CapturingFrameCounter] = _ProcessingInstance.colorBitmap; 

平等檢查在中間窗口:

ColorFrames_Array[0].Equals(ColorFrames_Array[1]) 
true 
ColorFrames_Array[0].Equals(ColorFrames_Array[2]) 
true 

請給我關於這個問題的一些提示。任何想法?

+0

發生這種情況可能是因爲您沒有創建新的_ProcessingInstance,因此所有元素都引用一個對象。 – Yar

回答

1

感謝亞爾

你是正確的,當我創建一個新的實例,幀正確保存。 但我的代碼是基於微軟的例子,問題是創建新的實例會導致內存泄漏,因爲writablebitmap不是一次性的。

類似的問題在下面的鏈接幀被frizzed到第一框架討論,這是從WriteableBitmap的的固有性質:

http://www.wintellect.com/devcenter/jprosise/silverlight-s-big-image-problem-and-what-you-can-do-about-it

因此,我使用類似於上述溶液中的策略並嘗試獲取副本而不是原始位圖幀。在這種情況下,我在初始化步驟中爲ColorFrames_Array []的每個元素創建了一個新的可寫位圖。

ColorFrames_Array = new riteableBitmap[MaximumFramesNumbers_Capturing]; 
      for (int i=0; i < MaximumFramesNumbers_Capturing; ++i) 
      { 
       ColorFrames_Array[i] = new WriteableBitmap(color_width, color_height, 96.0, 96.0, PixelFormats.Bgr32, null); 
      } 

最後,使用克隆方法將位圖幀複製到數組元素。

ColorFrames_ArrayBuffer[CapturingFrameCounter] = _ProcessingInstance.colorBitmap.Clone(); 

雖然上面的解決方案的作品,但它有一個巨大的內存泄漏!! 因此,我使用Arrayable和.copypixel方法(writeablebitmap)將幀的像素複製到數組並保存它(而相應的writeablebitmap將正確放置而沒有泄漏)。

public Array[] ColorPixels_Array; 

for (int i=0; i< MaximumFramesNumbers_Capturing; ++i) 
      { 
ColorPixels_Array[i]=new int[color_Width * color_Height]; 
     } 

colorBitmap.CopyPixels(ColorPixels_Array[Counter_CapturingFrame], color_Width * 4, 0); 

最後,當我們要保存的像素陣列,我們需要將它們轉換新的WriteableBitmap的實例,並將它們寫在硬盤。

wb = new WriteableBitmap(color_Width, color_Height, 96.0, 96.0, PixelFormats.Bgr32, null); 
wb.WritePixels(new Int32Rect(0, 0, color_Width, color_Height) 
           , Ar_Px, 
           color_Width * 4, 0);