如何水平翻转Kinect v2 colorstream?

时间:2018-06-09 21:55:36

标签: c# kinect-sdk kinect-v2

我最近在win 10 PC上设置了我的Kinect v2。打算将它用于一些VR混合现实流媒体我发现视频源是镜像的,没有办法翻转它。

我试图将SDK中的Coordinate Mapping Basics程序修改为绿色屏幕并翻转图像。我已经完成了绿色,但是我无法让颜色转变为翻转!

我尝试将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: 我现在让它以30fps的速度运行。只是为了更好地获得性能!我把变量拉出来,所以它不是一直在制造新阵列,只是回收旧的阵列。现在考虑运行并行for循环,一个从数组的开始,另一个从结束。不知道这是否会加速它或使用更多/更少的处理能力。现在,该程序使用了我的CPU的40-50%,这是疯狂的,远远超过我能做的和VR。如果有人拥有它们,仍然有兴趣更快/更有效地翻转图像。

更新3: 通过稍微修补和清理旧实验,性能得到了提升,但仍然使用了非翻转版本使用的两倍的cpu。

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 :(得分:0)

你试过这个吗? https://msdn.microsoft.com/en-us/library/system.drawing.image.rotateflip(v=vs.110).aspx

看起来就像你正在寻找的......