我正在尝试开发基于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 :(得分:1)
谢谢Yar
你是对的,当我创建一个新实例时,帧被正确保存。 但我的代码基于Microsoft示例,问题是创建新实例会导致内存泄漏,因为writablebitmap不是一次性的。
类似的问题在下面的链接中讨论,帧被frizzed到第一帧,这是来自writeablebitmap的内在属性:
因此我使用类似于上述解决方案的策略并尝试获取副本而不是原始位图帧。在这种情况下,我在初始化步骤为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);
}
最后,使用clone方法将位图帧复制到数组元素。
ColorFrames_ArrayBuffer[CapturingFrameCounter] = _ProcessingInstance.colorBitmap.Clone();
虽然上面的解决方案有效,但它有很大的内存泄漏!!
因此,我使用Array和.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);