Сохранение кадров kinect v2 в массиве

Я пытаюсь разработать программное обеспечение на основе Kinect v2, и мне нужно хранить захваченные кадры в массиве. У меня есть проблема, и я понятия не имею об этом, как показано ниже.

Захваченные кадры обрабатываются моим классом обработки, и обработанное растровое изображение с возможностью записи будет вызываться как источник поля изображения в моем окне пользовательского интерфейса, который отлично работает, и у меня есть кадры в реальном времени в моем пользовательском интерфейсе. Например:

/// 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

Пожалуйста, дайте мне несколько советов по этой проблеме. Есть идеи?


person moha    schedule 08.06.2017    source источник
comment
Это происходит, вероятно, потому, что вы не создаете новый _ProcessingInstance, поэтому все элементы относятся к одному объекту.   -  person Yar    schedule 08.06.2017


Ответы (1)


Спасибо Яр

Вы правы, и когда я создаю новый экземпляр, кадры сохраняются правильно. Но мой код был основан на примере Microsoft, и проблема в том, что создание новых экземпляров приводит к утечке памяти, потому что writablebitmap не является одноразовым.

аналогичная проблема обсуждается в следующей ссылке, в которой кадры переходят к первому кадру, и это связано с внутренними свойствами writeablebitmap:

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

Поэтому я использую стратегию, аналогичную приведенному выше решению, и пытаюсь получить копию вместо исходного кадра растрового изображения. В этом сценарии я создал новый writeblebitmap для каждого элемента 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();

Хотя вышеуказанное решение работает, но оно имеет огромную утечку памяти!! Поэтому я использую методы 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);
person moha    schedule 13.06.2017