Можно ли в потоке захвата показать видео с распознаванием лиц?

Я использую MediaCapture API для приложения для записи видео.

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

Несмотря на то, что я указываю VideoRecord как MediaStreamType при добавлении эффекта, прямоугольники не появляются в видео конечного результата, что и является моей целью.

var definition = new FaceDetectionEffectDefinition
 {
    SynchronousDetectionEnabled = false,
    DetectionMode = FaceDetectionMode.HighPerformance
};

try
{
    faceDetectionEffect = (FaceDetectionEffect)await mediaCapture.AddVideoEffectAsync(definition, MediaStreamType.VideoRecord);
}
catch (Exception exception)
{
    // Error message
    return;
}
faceDetectionEffect.FaceDetected += FaceDetectionEffect_FaceDetected;
faceDetectionEffect.DesiredDetectionInterval = TimeSpan.FromMilliseconds(33);
faceDetectionEffect.Enabled = true;

Есть какие-нибудь советы о том, как включить обнаружение и отслеживание лиц в потоке захвата или в видео конечного результата?

Спасибо!

==================================

По сути, я хотел бы, чтобы обнаружение и отслеживание лиц отображалось в CaptureElement, чтобы скрытие личности (скрытие лица пользователя изображением, которое отслеживает его лицо) можно было выполнить в окончательном видео.

Мой код заимствован из универсальных примеров Windows: https://github.com/microsoft/Windows-universal-samples

Есть CaptureElement, где рендерится видеопоток с камеры. Для рисования прямоугольников обнаруженных лиц используется Canvas.

<CaptureElement Name="PreviewControl"                            
                            Opacity="0.8"
                            Stretch="Fill"
                            IsDoubleTapEnabled="True" />

<Canvas>
    <Canvas Name="FacesCanvas"
        RenderTransformOrigin="0.5,0.5" />
                </Canvas>

Вот так FaceDetectionEffectDefinition добавляется к объекту MediaCapture и FaceDetectionEffect ...

private async Task CreateFaceDetectionEffectAsync()
{
    var definition = new FaceDetectionEffectDefinition
    {
            SynchronousDetectionEnabled = false,
            DetectionMode = FaceDetectionMode.HighPerformance
    };
    try
    {
            faceDetectionEffect = (FaceDetectionEffect)await mediaCapture.AddVideoEffectAsync(definition,       MediaStreamType.VideoRecord);
    }
    catch (Exception exception)
    {
            //exception.Message.ToString()
            return;
    }
    faceDetectionEffect.FaceDetected += FaceDetectionEffect_FaceDetected;
    faceDetectionEffect.DesiredDetectionInterval = TimeSpan.FromMilliseconds(33);
    faceDetectionEffect.Enabled = true;
}

Что происходит внутри события FaceDetectionEffect ...

private async void FaceDetectionEffect_FaceDetected(FaceDetectionEffect sender, FaceDetectedEventArgs args)
{
    await MainPage.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => HighlightDetectedFaces(args.ResultFrame.DetectedFaces));
}

private void HighlightDetectedFaces(IReadOnlyList<DetectedFace> faces)
{
    facesCanvas.Children.Clear();
    if (softwareBitmapSource == null)
        return;

                for (int i = 0; i < faces.Count; i++)
                {
                    Rectangle faceBoundingBox = ConvertPreviewToUiRectangle(faces[i].FaceBox);                
                    faceBoundingBox.Fill = new ImageBrush
                    {
                            ImageSource = softwareBitmapSource
                    };                
                    facesCanvas.Children.Add(faceBoundingBox);
                }               
}

Объект MediaCapture инициализируется и устанавливается как источник CaptureElement в начале ...

(Некоторый код, например указание типа медиапотока для VideoPreview и VideoRecord, если он не идентичен, был опущен.)

MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings { VideoDeviceId = preferredCamera.Id, AudioDeviceId = preferredMicrophone.Id };

await mediaCapture.InitializeAsync(settings);

PreviewControl.Source = mediaCapture;

Надеюсь, есть более простой метод, без необходимости прибегать к использованию MediaComposition и оверлеев.


person M Psyllakis    schedule 20.02.2021    source источник
comment
Не могли бы вы показать мне более подробный код кейса?   -  person YanGu    schedule 22.02.2021
comment
Спасибо за ответ, YanGu! Я включил дополнительный код в исходный вопрос, однако он может не понадобиться.   -  person M Psyllakis    schedule 23.02.2021
comment
Я думаю обрабатывать каждый видеокадр, чтобы добавить эффект прямоугольника, но это сложно. Другой более простой способ - записать видео с эффектом прямоугольника с помощью пространства имен Windows.Media.AppRecording в вашем приложении, но это снизит четкость видео. Постараемся найти другие доступные способы.   -  person YanGu    schedule 25.02.2021
comment
Да, я знаком с API AppRecordingManager, однако он ограничивает запись разрешением экрана. Возможно, лучшим решением будет захватить координаты каждого прямоугольника в массиве в режиме реального времени, а затем добавить MediaOverlay в этом месте в MediaComposition перед предварительным просмотром.   -  person M Psyllakis    schedule 26.02.2021
comment
Я согласен. И мы также пытаемся решить, как обрабатывать каждый видеокадр прямоугольником, как вы описали.   -  person YanGu    schedule 01.03.2021


Ответы (1)


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

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

person YanGu    schedule 16.03.2021
comment
Спасибо, создание видеоэффекта с помощью FaceDetector и добавление его в видеопоток имеет большой смысл. Я сделал обходной путь, упомянутый в предыдущем комментарии, который заключался в том, чтобы захватить данные координат, созданные FaceTracker, а затем создать наложения с этими координатами. Выглядит неплохо, но метод видеоэффекта лучше. Спасибо! - person M Psyllakis; 17.03.2021