Поделиться через


Эффекты для анализа кадров камеры

В этой статье описывается, как использовать SceneAnalysisEffect и FaceDetectionEffect для анализа содержимого потока предварительного просмотра записи мультимедиа.

Эффект анализа сцены

SceneAnalysisEffect анализирует видеокадры в потоке предварительной версии записи мультимедиа и рекомендует параметры обработки для улучшения результата записи. В настоящее время эффект поддерживает определение того, будет ли запись улучшена с помощью обработки высокого динамического диапазона (HDR).

Если эффект рекомендует использовать HDR, это можно сделать следующим образом:

Пространства имен анализа сцены

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

using Windows.Media.Core;
using Windows.Media.Devices;

Инициализация эффекта анализа сцены и добавление его в поток предварительной версии

Видеоэффекты реализуются с помощью двух API, определения эффекта, которое предоставляет параметры, необходимые устройству записи для инициализации эффекта, и экземпляра эффекта, который можно использовать для управления эффектом. Так как вы можете получить доступ к экземпляру эффекта из нескольких мест в коде, обычно следует объявить переменную-член для хранения объекта.

private SceneAnalysisEffect _sceneAnalysisEffect;

В приложении после инициализации объекта MediaCapture создайте новый экземпляр SceneAnalysisEffectDefinition.

Зарегистрируйте эффект с помощью устройства захвата, вызвав AddVideoEffectAsync в объекте MediaCapture, предоставляя Объект SceneAnalysisEffectDefinition и указав MediaStreamType.VideoPreview, чтобы указать, что эффект должен применяться к потоку предварительного просмотра видео, в отличие от потока захвата. AddVideoEffectAsync возвращает экземпляр добавленного эффекта. Так как этот метод можно использовать с несколькими типами эффектов, необходимо привести возвращаемый экземпляр к объекту SceneAnalysisEffect .

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

В настоящее время эффект анализа сцены включает только анализатор динамического диапазона. Включите анализ HDR, задав для эффекта значение HighDynamicRangeControl.Enabled значение true.

// Create the definition
var definition = new SceneAnalysisEffectDefinition();

// Add the effect to the video record stream
_sceneAnalysisEffect = (SceneAnalysisEffect)await _mediaCapture.AddVideoEffectAsync(definition, MediaStreamType.VideoPreview);

// Subscribe to notifications about scene information
_sceneAnalysisEffect.SceneAnalyzed += SceneAnalysisEffect_SceneAnalyzed;

// Enable HDR analysis
_sceneAnalysisEffect.HighDynamicRangeAnalyzer.Enabled = true;

Реализация обработчика событий SceneAnalyzed

Результаты анализа сцен возвращаются в обработчике событий SceneAnalyzed . Объект SceneAnalyzedEventArgs, переданный в обработчик, имеет объект SceneAnalysisEffectFrame, имеющий объект HighDynamicRangeOutput. Свойство Certainty выходных данных с высоким динамическим диапазоном предоставляет значение от 0 до 1.0, где 0 указывает, что обработка HDR не поможет улучшить результат записи, а 1.0 указывает, что обработка HDR поможет. Вы можете выбрать точку порогового значения, в которой вы хотите использовать HDR, или отобразить результаты пользователю и разрешить пользователю решить.

private void SceneAnalysisEffect_SceneAnalyzed(SceneAnalysisEffect sender, SceneAnalyzedEventArgs args)
{
    double hdrCertainty = args.ResultFrame.HighDynamicRange.Certainty;
    
    // Certainty value is between 0.0 and 1.0
    if(hdrCertainty > MyCertaintyCap)
    {
        ShowMessageToUser("Enabling HDR capture is recommended.");
    }
}

Объект HighDynamicRangeOutput, передаваемый в обработчик, также имеет свойство FrameControllers, содержащее предлагаемые контроллеры кадров для записи последовательности переменных фотографий для обработки HDR. Дополнительные сведения см. в разделе "Переменная последовательность фотографий".

Очистка эффекта анализа сцены

После завершения записи приложения перед удалением объекта MediaCapture необходимо отключить эффект анализа сцены, задав свойству HighDynamicRangeAnalyzer.Enabled значение false и отменить регистрацию обработчика событий SceneAnalyzed. Вызов MediaCapture.ClearEffectsAsync, указав поток предварительного просмотра видео, так как это был поток, в который был добавлен эффект. Наконец, задайте для переменной-член значение NULL.

// Disable detection
_sceneAnalysisEffect.HighDynamicRangeAnalyzer.Enabled = false;

_sceneAnalysisEffect.SceneAnalyzed -= SceneAnalysisEffect_SceneAnalyzed;

// Remove the effect from the preview stream
await _mediaCapture.ClearEffectsAsync(MediaStreamType.VideoPreview);

// Clear the member variable that held the effect instance
_sceneAnalysisEffect = null;

Эффект обнаружения лиц

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

Пространства имен обнаружения лиц

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

using Windows.Media.Core;

Инициализация эффекта обнаружения лиц и добавление его в поток предварительной версии

Видеоэффекты реализуются с помощью двух API, определения эффекта, которое предоставляет параметры, необходимые устройству записи для инициализации эффекта, и экземпляра эффекта, который можно использовать для управления эффектом. Так как вы можете получить доступ к экземпляру эффекта из нескольких мест в коде, обычно следует объявить переменную-член для хранения объекта.

FaceDetectionEffect _faceDetectionEffect;

В приложении после инициализации объекта MediaCapture создайте новый экземпляр FaceDetectionEffectDefinition. Задайте свойству DetectionMode приоритет более быстрое обнаружение лиц или более точное обнаружение лиц. Задайте для синхронногоdetectionEnabled значение, чтобы указать, что входящие кадры не задерживаются, ожидая завершения обнаружения лиц, так как это может привести к выполнению предварительной версии.

Зарегистрируйте эффект с помощью устройства записи, вызвав AddVideoEffectAsync в объекте MediaCapture, предоставляя FaceDetectionEffectDefinition и указав MediaStreamType.VideoPreview, чтобы указать, что эффект должен применяться к потоку предварительного просмотра видео, а не к потоку записи. AddVideoEffectAsync возвращает экземпляр добавленного эффекта. Так как этот метод можно использовать с несколькими типами эффектов, необходимо привести возвращаемый экземпляр к объекту FaceDetectionEffect .

Включите или отключите эффект, задав свойство FaceDetectionEffect.Enabled . Настройте частоту анализа кадров, задав свойство FaceDetectionEffect.DesiredDetectionInterval . Оба этих свойства могут быть изменены во время отслеживания мультимедиа.


// Create the definition, which will contain some initialization settings
var definition = new FaceDetectionEffectDefinition();

// To ensure preview smoothness, do not delay incoming samples
definition.SynchronousDetectionEnabled = false;

// In this scenario, choose detection speed over accuracy
definition.DetectionMode = FaceDetectionMode.HighPerformance;

// Add the effect to the preview stream
_faceDetectionEffect = (FaceDetectionEffect)await _mediaCapture.AddVideoEffectAsync(definition, MediaStreamType.VideoPreview);

// Choose the shortest interval between detection events
_faceDetectionEffect.DesiredDetectionInterval = TimeSpan.FromMilliseconds(33);

// Start detecting faces
_faceDetectionEffect.Enabled = true;

Получение уведомлений при обнаружении лиц

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

// Register for face detection events
_faceDetectionEffect.FaceDetected += FaceDetectionEffect_FaceDetected;

В обработчике события можно получить список всех лиц, обнаруженных в кадре, путем доступа к свойству FaceDetectionEffectFrame.DetectedFaces объекта FaceDetectedEventArgs. Свойство FaceBox — это структура BitmapBounds, описывающая прямоугольник, содержащий обнаруженное лицо в единицах относительно измерений потока предварительного просмотра. Чтобы просмотреть пример кода, который преобразует координаты потока предварительного просмотра в координаты экрана, см . пример обнаружения лиц UWP.

private void FaceDetectionEffect_FaceDetected(FaceDetectionEffect sender, FaceDetectedEventArgs args)
{
    foreach (Windows.Media.FaceAnalysis.DetectedFace face in args.ResultFrame.DetectedFaces)
    {
        BitmapBounds faceRect = face.FaceBox;

        // Draw a rectangle on the preview stream for each face
    }
}

Очистка эффекта обнаружения лиц

После завершения записи приложения перед удалением объекта MediaCapture необходимо отключить эффект обнаружения лиц с помощью FaceDetectionEffect.Enabled и отменить регистрацию обработчика событий FaceDetected, если вы ранее зарегистрировали его. Вызов MediaCapture.ClearEffectsAsync, указав поток предварительного просмотра видео, так как это был поток, в который был добавлен эффект. Наконец, задайте для переменной-член значение NULL.

// Disable detection
_faceDetectionEffect.Enabled = false;

// Unregister the event handler
_faceDetectionEffect.FaceDetected -= FaceDetectionEffect_FaceDetected;

// Remove the effect from the preview stream
await _mediaCapture.ClearEffectsAsync(MediaStreamType.VideoPreview);

// Clear the member variable that held the effect instance
_faceDetectionEffect = null;

Проверка поддержки фокуса и экспозиции для обнаруженных лиц

Не все устройства имеют устройство захвата, которое может настроить фокус и экспозицию на основе обнаруженных лиц. Так как обнаружение лиц потребляет ресурсы устройства, возможно, требуется только включить обнаружение лиц на устройствах, которые могут использовать эту функцию для улучшения записи. Чтобы узнать, доступна ли оптимизация захвата на основе лиц, получите VideoDeviceController для инициализированного MediaCapture, а затем получите элемент "RegionsOfInterestControl" контроллера видеоустройства. Проверьте, поддерживает ли MaxRegions хотя бы один регион. Затем проверьте, верно ли значение Auto ExposureSupported или AutoFocusSupported. Если эти условия выполнены, устройство может воспользоваться преимуществами обнаружения лиц для улучшения захвата.

var regionsControl = _mediaCapture.VideoDeviceController.RegionsOfInterestControl;
bool faceDetectionFocusAndExposureSupported =
    regionsControl.MaxRegions > 0 &&
    (regionsControl.AutoExposureSupported || regionsControl.AutoFocusSupported);