Отображение видеокадра и положения 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;
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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, чтобы установить позицию, в которой вы хотите обрезать.

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