Как я могу перевернуть поток цветов Kinect v2 по горизонтали?
Я недавно установил свой Kinect v2 на свой win 10 PC. Намереваясь использовать его для потоковой передачи смешанной реальности 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 ответ
Вы пробовали это? https://msdn.microsoft.com/en-us/library/system.drawing.image.rotateflip(v=vs.110).aspx
Похоже, именно то, что вы ищете...