1

XNAアプリケーションを作成しており、Webカメラからスクリーンショットを1秒間に4回キャプチャし、ピクセルの色が赤が特定のしきい値を下回ったときにブール配列に変換しようとしています。Texture2Dに変換するとラグは発生しませんが、個々のピクセルを取得しようとすると、Webカメラの解像度が176x144の場合でも、ラグが発生します。

これは、ビットマップを取得するためのコードです。

public Bitmap getBitmap()
    {
        if (!panelVideoPreview.IsDisposed)
        {
            Bitmap b = new Bitmap(panelVideoPreview.Width, panelVideoPreview.Height, PixelFormat.Format32bppRgb);
            using (Graphics g = Graphics.FromImage(b))
            {
                Rectangle rectanglePanelVideoPreview = panelVideoPreview.Bounds;
                Point sourcePoints = panelVideoPreview.PointToScreen(new Point(panelVideoPreview.ClientRectangle.X, panelVideoPreview.ClientRectangle.Y));
                g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size);
            }

            return b;
        }
        else
        {
            Bitmap b = new Bitmap(panelVideoPreview.Width, panelVideoPreview.Height);
            return b;
        }
    }

これは、ビットマップをブール配列に変換するためのコードです。

public bool[,] getBoolBitmap(uint treshold)
    {
        Bitmap b = getBitmap();

        bool[,] ar = new bool[b.Width, b.Height];

        for (int y = 0; y < b.Height; y++)
        {
            for (int x = 0; x < b.Width; x++)
            {
                if (b.GetPixel(x, y).R < treshold)
                {
                    ar[x, y] = false;
                }
                else
                {
                    ar[x, y] = true;
                }
            }
        }

        return ar;
    }
4

1 に答える 1

2

Hans Passant が提供した答えは正しいです。LockBits を使用して、一度にデータを処理することをお勧めします。

また、データのしきい値を設定するシェーダーを作成して、GPU の能力を利用して、入力画像ストリームをはるかに高速に並列処理することもできます。

于 2012-05-02T13:55:09.390 に答える