最近、Win 10 PC に Kinect v2 をセットアップしました。いくつかの VR 複合現実ストリーミングに使用するつもりですが、ビデオ フィードがミラーリングされており、それを反転する方法がないことがわかりました。
SDK の Coordinate Mapping Basics プログラムをグリーン スクリーンに変更し、画像を反転させようとしました。私がやった緑ですが、カラーストリームを反転させることはできません!
WriteableBitmap をビットマップに変換して配列にエクスポートし、配列を反転して WritableBitmap に書き戻そうとしましたが、うまくいきませんでした。
WriteableBitmapEx ライブラリをインストールしてフリップ機能を使用しようとしましたが、プログラムがフリーズします。
助言がありますか?
長期的には、プログラムが仮想ウェブカメラとして機能し、ビデオフィードをコンポジターに直接渡すことも必要ですが、一度に1ステップです。
更新: 画像を反転させましたが、パフォーマンスが大幅に低下しました。これを書き、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 fps のように見えるようになりました。パフォーマンスを向上させるだけです!変数を引き出したので、常に新しい配列を作成するのではなく、古い配列をリサイクルするだけでした。次に、for ループを並列に実行することを考えます。1 つは配列の先頭から、もう 1 つは配列の末尾から実行します。それがそれを高速化するのか、それともより多くの/より少ない処理能力を使用するのかはわかりません。現在、このプログラムは私の CPU の 40 ~ 50% を使用しています。誰かが持っている場合は、画像を反転するためのより高速で効率的な方法にまだ興味があります。
更新 3: 古い実験をもう少しいじくり回してクリーニングすることで、パフォーマンスは向上しましたが、フリップしていないバージョンの 2 倍の 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;
}
}