Как я могу перевернуть цветовой поток Kinect v2 по горизонтали? - PullRequest
0 голосов
/ 10 июня 2018

Я недавно установил свой Kinect v2 на свой win 10 ПК.Намереваясь использовать его для потоковой передачи смешанной реальности VR, я обнаружил, что видеопоток зеркально отражен, и его невозможно перевернуть.

Я попытался изменить программу «Основы картирования координат» в SDK, чтобы она отображалась на зеленом экране и переворачивала изображение.Зеленый, который я сделал, но я не могу заставить перевернуть цветовой поток!

Я попытался превратить WriteableBitmap в растровое изображение, экспортировать его в массив, затем перевернуть массив и записать его обратно в WritableBitmap, но это не помоглот работа.

Я пытался установить библиотеку WriteableBitmapEx и использовать функцию переворота, но программа просто зависает.

Есть предложения?

В долгосрочной перспективе я также хочу, чтобы программа действовала как виртуальнаяВеб-камера для передачи видеопотока прямо в композитор, но по одному шагу за раз.

ОБНОВЛЕНИЕ: У меня есть изображение, которое нужно перевернуть, НО при ОГРОМНОМ падении производительности.Написал это, чтобы преобразовать WriteableBitmap в байтовый массив, а затем изменить порядок.Выполнение некоторых тестов - это цикл, который убивает производительность.Какие-нибудь альтернативы или способы оптимизировать цикл?

private void flipBitmap(int method)
    {            
        if (method == 1)//works but slow.
        {
            var width = this.bitmap.PixelWidth;
            var height = this.bitmap.PixelHeight;
            var stride = ((PixelFormats.Bgr32.BitsPerPixel + 7) / 8) * width;
            int current, flipped = 0;
            var raw= new byte[stride * height];
            this.bitmap.CopyPixels(bitmapData, stride, 0);
            var flippedPixels = new byte[raw.Length];
            for (int y = 0; y < height; y++)
            {

                for (int x = 4; x < width; x++)
                {
                    current = (y * stride) + (x * 4);
                    flipped = (y * stride) + (width - x) * 4;
                    for (int i = 0; i < 3; i++)
                    {
                        flippedPixels[flipped + i] = raw[current + i];
                    }
                    flippedPixels[flipped + 3] = 255;
                }
            }
            this.bitmap.WritePixels(new Int32Rect(0, 0, width, height), flippedPixels, stride, 0);
        }
        else if(method == 2)//placeholder
        {
            return;
        }
        else 
        {
            return;
        }                        
    }

ОБНОВЛЕНИЕ 2: у меня теперь он работает на скорости 30 кадров в секунду.Просто надо улучшить производительность!Я вытащил переменные, чтобы они не создавали новые массивы все время, а просто перерабатывали старые.Теперь подумайте о том, чтобы запустить параллельные циклы: один идет с начала массива, другой с конца.Не знаю, если это ускорит его или использовать больше / меньше вычислительной мощности.Прямо сейчас программа использует 40-50% моего процессора, что безумие и намного больше, чем я могу сделать, а также VR.Все еще интересуются более быстрыми / более эффективными способами перевернуть изображение, если у кого-то они есть.

ОБНОВЛЕНИЕ 3: С небольшим перебором и очисткой старых экспериментов производительность улучшилась, но при этом все равно используется вдвое больше процессора, чем использует не перевернутая версия.

private void flipBitmap(int method)
    {

        if (method == 1)//works but cpu intensive.
        {           
            int current, flipped = 0;
            this.bitmap.CopyPixels(raw, stride, 0);                

            for (int y = 0; y < height; y++)
            {

                for (int x = 4; x < width; x++)
                {
                    current = (y * stride) + (x * 4);
                    flipped = (y * stride) + (width - x) * 4;

                    flippedPixels[flipped + 0] = raw[current + 0];
                    flippedPixels[flipped + 1] = raw[current + 1];
                    flippedPixels[flipped + 2] = raw[current + 2];
                    flippedPixels[flipped + 3] = 255;                        
                }
            }
            this.bitmap.WritePixels(new Int32Rect(0, 0, width, height), flippedPixels, stride, 0);

            return;
        }
        else if(method == 2)//placeholder
        {               
            return;
        }
        else 
        {                
            return;
        }                        
    }

1 Ответ

0 голосов
/ 10 июня 2018

Вы пробовали это?https://msdn.microsoft.com/en-us/library/system.drawing.image.rotateflip(v=vs.110).aspx

Похоже, именно то, что вы ищете ...

...