将kinect v2帧保存在数组中
Saving kinect v2 frames in an array
我正在尝试开发一个基于 Kinect v2 的软件,我需要将捕获的帧保存在一个数组中。我有一个问题,我对此一无所知。
捕获的帧由我的处理 class 处理,处理后的可写位图将作为我的 ui window 中图像框的来源调用,效果很好,我在我的 ui 中有一个实时帧。
例如:
/// Color
_ProcessingInstance.ProcessColor(colorFrame);
ImageBoxRGB.Source = _ProcessingInstance.colorBitmap;
但是当我想将其分配给数组的一个元素时,数组中的所有元素都将与第一帧相同!!我应该提一下,这个动作是在上面的动作存在的阅读事件中。
代码:
ColorFrames_Array[CapturingFrameCounter] = _ProcessingInstance.colorBitmap;
中间的相等检查window:
ColorFrames_Array[0].Equals(ColorFrames_Array[1])
true
ColorFrames_Array[0].Equals(ColorFrames_Array[2])
true
请给我一些关于这个问题的提示。有什么想法吗?
谢谢亚尔
你是对的,当我创建一个新实例时,帧被正确保存。
但我的代码是基于微软的例子,问题是创建新实例会导致内存泄漏,因为 writablebitmap 不是一次性的。
下面link讨论了类似的问题,帧被卷曲到第一帧,这是来自 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);
}
最后,使用克隆方法将位图帧复制到数组元素。
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);
最后,当我们想要保存像素数组时,我们需要将它们转换为新的可写位图实例并将它们写入硬盘。
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);
我正在尝试开发一个基于 Kinect v2 的软件,我需要将捕获的帧保存在一个数组中。我有一个问题,我对此一无所知。
捕获的帧由我的处理 class 处理,处理后的可写位图将作为我的 ui window 中图像框的来源调用,效果很好,我在我的 ui 中有一个实时帧。 例如:
/// Color
_ProcessingInstance.ProcessColor(colorFrame);
ImageBoxRGB.Source = _ProcessingInstance.colorBitmap;
但是当我想将其分配给数组的一个元素时,数组中的所有元素都将与第一帧相同!!我应该提一下,这个动作是在上面的动作存在的阅读事件中。 代码:
ColorFrames_Array[CapturingFrameCounter] = _ProcessingInstance.colorBitmap;
中间的相等检查window:
ColorFrames_Array[0].Equals(ColorFrames_Array[1])
true
ColorFrames_Array[0].Equals(ColorFrames_Array[2])
true
请给我一些关于这个问题的提示。有什么想法吗?
谢谢亚尔
你是对的,当我创建一个新实例时,帧被正确保存。 但我的代码是基于微软的例子,问题是创建新实例会导致内存泄漏,因为 writablebitmap 不是一次性的。
下面link讨论了类似的问题,帧被卷曲到第一帧,这是来自 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);
}
最后,使用克隆方法将位图帧复制到数组元素。
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);
最后,当我们想要保存像素数组时,我们需要将它们转换为新的可写位图实例并将它们写入硬盘。
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);