我最近在我的 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 循环,一个从数组的开头开始,另一个从结尾。不知道这是否会加快速度或使用更多/更少的处理能力。现在这个程序使用了我 40-50% 的 cpu,这太疯狂了,而且比我能做的和 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;
}
}