2017-06-08 6 views
1

私はKinect v2に基づいてソフトウェアを開発しようとしており、キャプチャされたフレームを配列に保存する必要があります。私は問題があり、私はそれについて次のように考えていません。キネクトv2フレームをアレイに保存する

キャプチャされたフレームは自分の処理クラスで処理され、処理された書き込み可能なビットマップは完全に動作するuiウィンドウのイメージボックスのソースとして呼び出され、私のUIにはリアルタイムフレームがあります。例えば :

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

を私は、配列の要素にこれを割り当てる場合、アレイ内のすべての要素は、第1のフレームと同一であろう!私は、この行動は上記の行動がそこにある読書イベントにあることに言及する必要があります。 コード:

ColorFrames_Array[CapturingFrameCounter] = _ProcessingInstance.colorBitmap; 

中間ウィンドウで同じチェック:

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

私にこの問題についていくつかのヒントを与えてください。何か案が?

+0

これはおそらく、新しい '_ProcessingInstance'を作成していないため、すべての要素が1つのオブジェクトを参照するためです。 – Yar

答えて

1

おかげヤール

あなたが正しいと私は、新しいインスタンスを作成するときに、フレームが正しく保存されています。 しかし、私のコードはMicrosoftの例に基づいていました。問題は、writablebitmapが使い捨てではないため、新しいインスタンスを作成するとメモリリークが発生することです。

同様の問題は、フレームが最初のフレームにfrizzedれる次のリンクで説明され、これはwriteablebitmapの固有の特性である。したがって

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

iが上記の溶液に類似の戦略を使用元のビットマップフレームの代わりにコピーを取得しようとします。このシナリオでは、初期化ステップでColorFrames_Array []の各要素のための新しいwriteblebitmapを作成しました。

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); 
関連する問題