Вопрос по c#, arrays, performance – Быстрый способ преобразовать растровое изображение в логический массив в C #?

1

Я делаю приложение XNA, где я делаю снимок экрана с веб-камеры 4 раза в секунду, а затем пытаюсь преобразовать его в логический массив, когда цвет пикселя Red ниже определенного порога. Когда я конвертирую его в Texture2D, он не запаздывает, но когда я пытаюсь получить отдельные пиксели, он запаздывает, даже если разрешение веб-камеры составляет 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;
    }
GetPixel () очень медленный, он должен блокировать растровые данные для каждого отдельного пикселя. Вместо этого используйте Bitmap.LockBits (). Много хитов, когда вы положите это в поле поиска. Hans Passant

Ваш Ответ

1   ответ
2

Ответ, предоставленный Хансом Пассантом, правильный, лучше использовать LockBits и обрабатывать данные сразу.

Вы также можете попробовать написать шейдер, который порождает данные и, таким образом, использует возможности графического процессора для параллельной обработки потока входного изображения намного, намного быстрее.

Похожие вопросы