Отображение видеокадра и положения rendertargetbitmap

Я пытаюсь обрезать изображение с веб-камеры и отображать его рядом с превью камеры.

При кадрировании изображения следует учитывать 3 соображения.

  1. Вывод обрезанного изображения должен быть в формате VideoFrame.
  2. Приведенный выше вывод, VideoFrame, необходимо отобразить (в XAML).
  3. Целевое изображение кадрирования находится в середине исходного изображения.

Я обнаружил, что RenderTargetBitmap поможет мне получить обрезанное изображение.

Но до сих пор понятия не имею, как отобразить VideoFrame (без сохранения изображения), установить позицию, где обрезать.

Я застрял внизу ...

    public async Task<VideoFrame> CroppingImage(Grid grid)
    {
        RenderTargetBitmap renderBitmap = new RenderTargetBitmap();

        await renderBitmap.RenderAsync(grid);
        var buffer = await renderBitmap.GetPixelsAsync();
        var softwareBitmap = SoftwareBitmap.CreateCopyFromBuffer(buffer, BitmapPixelFormat.Bgra8, renderBitmap.PixelWidth, renderBitmap.PixelHeight, BitmapAlphaMode.Ignore);

        buffer = null;
        renderBitmap = null;

        VideoFrame vf = VideoFrame.CreateWithSoftwareBitmap(softwareBitmap);
        await CropAndDisplayInputImageAsync(vf);

        return cropped_vf;
    }


    private async Task CropAndDisplayInputImageAsync(VideoFrame inputVideoFrame)
    {
        //some cropping algorithm here
        //i have a rectangle on a canvas(camera preview is on CaptureElement)
        //I know the left top position and width and height but no idea how to use
    }

Любая помощь?

Вот что я нашел и сделал :)

(предположим, что есть видеокадр с названием croppedface)

        croppedFace = new VideoFrame(BitmapPixelFormat.Bgra8, (int)width, (int)height, BitmapAlphaMode.Ignore);

        await inputVideoFrame.CopyToAsync(croppedFace, cropBounds, null);

        SoftwareBitmap asdf = croppedFace.SoftwareBitmap;
        asdf = SoftwareBitmap.Convert(asdf, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore);
        var qwer = new SoftwareBitmapSource();
        await qwer.SetBitmapAsync(asdf);
        CroppedFaceImage.Source = qwer;
2
0
308
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

But still I have no idea how to display VideoFrame(without saving an image), set the position where to crop.

Если вы хотите показать фрейм в xaml, вам необходимо преобразовать фрейм в отображаемый формат и отобразить его на экране. Пожалуйста, проверьте класс FrameRender в официальном Образец кадров камеры. У него есть метод ConvertToDisplayableImage, который должен быть тем, что вам нужно.

Затем вы можете показать его в элементе управления изображением. После этого вы можете использовать Image.Clip, чтобы установить позицию, в которой вы хотите обрезать.

Другие вопросы по теме