2017-06-08 37 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);