Ручные элементы управления для видеозахвата на камере

В этой статье рассказывается, как с помощью ручных элементов управления устройства включить расширенные сценарии видеозахвата, в том числе видеосъемку с расширенным динамическим диапазоном (HDR) и приоритетом экспозиции.

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

Все API элементов управления устройства, описанные в этой статье, входят в пространство имен Windows.Media.Devices.

using Windows.Media.Devices;

Примечание

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

Видео HDR

Функция расширенного динамического диапазона (HDR) для видео позволяет применять к видеопотоку устройства захвата обработку HDR. Чтобы определить, поддерживается ли видео HDR, проверьте свойство HdrVideoControl.Supported.

Элемент управления видео HDR работает в трех режимах "Включен", "Отключен" и "Автоматический режим". Устройство в динамическом режиме определяет, улучшит ли обработка видео HDR захват мультимедиа, и, если это так, включает функцию HDR. Чтобы определить, поддерживается ли на текущем устройстве определенный режим, проверьте, доступен ли он в коллекции HdrVideoControl.SupportedModes.

Чтобы включить или отключить обработку видео HDR, переведите свойство HdrVideoControl.Mode в нужный режим. Для этого элемента управления требуется, чтобы поток был остановлен до установки режима, см. KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR.

private void SetHdrVideoMode(HdrVideoMode mode)
{
    if (!_mediaCapture.VideoDeviceController.HdrVideoControl.Supported)
    {
        ShowMessageToUser("HDR Video not available");
        return;
    }

    var hdrVideoModes = _mediaCapture.VideoDeviceController.HdrVideoControl.SupportedModes;

    if (!hdrVideoModes.Contains(mode))
    {
        ShowMessageToUser("HDR Video setting not supported");
        return;
    }

    _mediaCapture.VideoDeviceController.HdrVideoControl.Mode = mode;
}

Приоритет выдержки

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

Чтобы определить, поддерживается ли на текущем устройстве элемент управления приоритетом выдержки, проверьте свойство ExposurePriorityVideoControl.Supported.

Чтобы включить или отключить этот элемент управления, переведите свойство ExposurePriorityVideoControl.Enabled в нужный режим.

if (!_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Supported)
{
    ShowMessageToUser("Exposure priority not available");
    return;
}
_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Enabled = true;

Временное шумоподавление

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

VideoTemporalDenoisingControl позволяет приложению определить, поддерживается ли временное шумоподавление на текущем устройстве, и, если да, какие режимы шумоподавления поддерживаются. Доступны следующие режимы шумоподавления: Off, On и Auto. Устройство может не поддерживать все режимы, но каждое устройство должно поддерживать режим Auto или On и Off.

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

<StackPanel Orientation="Vertical" HorizontalAlignment="Right" >
    <StackPanel x:Name="denoiseControls" Visibility="Collapsed">
        <TextBlock>Temporal Denoising</TextBlock>
        <RadioButton x:Name="denoiseOffButton" Checked="denoiseButton_Checked"
    GroupName="Denoise Group" Content="Off"/>
        <RadioButton x:Name="denoiseOnButton" Checked="denoiseButton_Checked"
    GroupName="Denoise Group" Content="On" Visibility="Collapsed"/>
        <RadioButton x:Name="denoiseAutoButton" Checked="denoiseButton_Checked"
    GroupName="Denoise Group" Content="Auto" Visibility="Collapsed"/>
    </StackPanel>
</StackPanel>

В следующем методе проверяется свойство VideoTemporalDenoisingControl.Supported, чтобы определить, поддерживается ли временное шумоподавление на текущем устройстве. Если это так, мы проверяем, поддерживаются ли режимы Off и Auto или On. Если это так, мы отображаем наши переключатели. Затем кнопки Auto и On становятся видимыми, если эти методы поддерживаются.

private void UpdateDenoiseCapabilities()
{
    if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
    {
         IReadOnlyList<VideoTemporalDenoisingMode> modes = _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes;
        if(modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Off) &&
           (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On) || 
           modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto)))
        {
            denoiseControls.Visibility = Visibility.Visible;

            if (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
            {
                denoiseOnButton.Visibility = Visibility.Visible;
            }
            if (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
            {
                denoiseAutoButton.Visibility = Visibility.Visible;
            }
        }
    }
}

В обработчике события Checked для переключателей проверяется имя кнопки и устанавливается соответствующий режим с помощью свойства VideoTemporalDenoisingControl.Mode.

private void denoiseButton_Checked(object sender, RoutedEventArgs e)
{
    var button = sender as RadioButton;
    if(button.Name == "denoiseOffButton")
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
    }
    else if (button.Name == "denoiseOnButton")
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
    }
    else if (button.Name == "denoiseAutoButton")
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Auto;
    }
}

Отключение временного шумоподавления при обработке кадров

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

Следующий пример определяет, какие режимы шумоподавления поддерживаются, и сохраняет эту информацию в переменных класса.

private bool _isVideoTemporalDenoisingOffSupported = false;
private bool _isProcessing = false;
private Windows.Media.Devices.VideoTemporalDenoisingMode? _videoDenoisingEnabledMode = null;
private void ConfigureDenoiseForFrameProcessing()
{
    if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
    {
        // Query support for the VideoTemporalDenoising control Off mode
        _isVideoTemporalDenoisingOffSupported = _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Off);

        // Query support for a mode that would enable VideoTemporalDenoising (On or Auto) and toggle it if supported
        if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
        {
            _videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
            _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
        }
        else if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
        {
            _videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.Auto;
            _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
        }
    }

}

Если приложение включает обработку кадров, режиму шумоподавления присваивается значение Off, если этот режим поддерживается, чтобы при обработке кадров можно было использовать необработанные кадры.

public void EnableFrameProcessing()
{
    // Toggle Off VideoTemporalDenoising
    if (_isVideoTemporalDenoisingOffSupported)
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
    }

    _isProcessing = true;
}

Если приложение отключает обработку кадра, для режима шумоподавления устанавливается значение On или Auto в зависимости от того, какой режим поддерживается.

public void DisableFrameProcessing()
{
    _isProcessing = false;

    // If a VideoTemporalDenoising mode to enable VideoTemporalDenoising is supported, toggle it
    if (_videoDenoisingEnabledMode != null)
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
    }
}

Дополнительные сведения о получении видеокадров для обработки изображений см. в разделе Обработка кадров мультимедиа с помощью MediaFrameReader.