UWP манипулирование растровыми изображениями видеопотока - PullRequest
0 голосов
/ 03 июля 2018

Я закодировал пример от https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/custom-video-effects

Часть кода:

public void ProcessFrame(ProcessVideoFrameContext context)
    {

        using (CanvasBitmap inputBitmap = CanvasBitmap.CreateFromDirect3D11Surface(canvasDevice, context.InputFrame.Direct3DSurface))
        using (CanvasRenderTarget renderTarget = CanvasRenderTarget.CreateFromDirect3D11Surface(canvasDevice, context.OutputFrame.Direct3DSurface))
        using (CanvasDrawingSession ds = renderTarget.CreateDrawingSession())
        {

            var gaussianBlurEffect = new GaussianBlurEffect
            {
                Source = inputBitmap,
                BlurAmount = (float)BlurAmount,
                Optimization = EffectOptimization.Speed
            };

            ds.DrawImage(gaussianBlurEffect);
        }
    }

Проблема в том, что я хочу рисовать точки (точечные рисунки) на кадрах, но я не знаю, как передать конкретные координаты в функцию ProcessFrame. На входе у меня есть координаты x и y для каждого кадра, где нужно рисовать точку, а на выходе я хочу иметь видео с добавленными точками для каждого кадра. Спасибо за помощь. Frame before processing Frame after processing

1 Ответ

0 голосов
/ 03 июля 2018

EDIT: Приведенный ниже код не является подходящим решением, так как ProcessFrame(ProcessVideoFrameContext context) является частью реализации интерфейса.

Мое следующее решение - создать пользовательский эффект, похожий на GaussianBlusEffect и многие другие. Пример здесь:

https://github.com/Microsoft/Win2D-Samples/blob/master/ExampleGallery

~~~ Ниже оригинального ответа для справки.

Вы можете передать параметры X и Y и получить доступ к пикселям изображения.

public void ProcessFrame(ProcessVideoFrameContext context, int X, int Y)
    {

    using (CanvasBitmap inputBitmap = CanvasBitmap.CreateFromDirect3D11Surface(canvasDevice, context.InputFrame.Direct3DSurface))
    using (CanvasRenderTarget renderTarget = CanvasRenderTarget.CreateFromDirect3D11Surface(canvasDevice, context.OutputFrame.Direct3DSurface))
    using (CanvasDrawingSession ds = renderTarget.CreateDrawingSession())
    {

        Color[] Pixels = inputBitmap.GetPixelColors();
        // Manipulate the array using X and Y with the Width parameter of the bitmap

        var gaussianBlurEffect = new GaussianBlurEffect
        {
            Source = inputBitmap,
            BlurAmount = (float)BlurAmount,
            Optimization = EffectOptimization.Speed
        };

        ds.DrawImage(gaussianBlurEffect);
    }
}

Подробнее: https://microsoft.github.io/Win2D/html/M_Microsoft_Graphics_Canvas_CanvasBitmap_GetPixelColors.htm

Я не проверял, является ли Color [] указателем на текущий буфер или копию. Если это копия, то вы должны записать обратно в буфер с помощью SetPixelColors.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...