Controles manuales de la cámara para la captura de vídeo.

En este artículo se muestra cómo usar controles manuales de dispositivo para habilitar escenarios de captura de vídeo mejorados, como vídeo HDR y prioridad de exposición.

Los controles de dispositivo de vídeo descritos en este artículo se agregan a la aplicación mediante el mismo patrón. En primer lugar, compruebe si el control es compatible con el dispositivo actual en el que se ejecuta la aplicación. Si el control es compatible, establezca el modo deseado para el control. Normalmente, si un control determinado no es compatible con el dispositivo actual, debe deshabilitar u ocultar el elemento de interfaz de usuario que permite al usuario habilitar la característica.

Todas las API de control de dispositivos que se describen en este artículo forman parte del espacio de nombres Windows.Media.Devices.

using Windows.Media.Devices;

Nota:

Este artículo se basa en los conceptos y el código analizados en Captura básica de fotos, audio y vídeo con MediaCapture, donde se describen los pasos para implementar la captura básica de fotos y vídeo. Se recomienda que te familiarices con el patrón de captura de multimedia básico de ese artículo antes de pasar a escenarios de captura más avanzados. El código que encontrarás en este artículo se ha agregado suponiendo que la aplicación ya tiene una instancia de MediaCapture inicializada correctamente.

Vídeo HDR

La característica de vídeo de alto rango dinámico (HDR) aplica el procesamiento HDR a la secuencia de vídeo del dispositivo de captura. Determine si el vídeo HDR es compatible seleccionando la propiedad HdrVideoControl.Supported.

El control de vídeo HDR admite tres modos: activado, desactivado y automático, lo que significa que el dispositivo determina dinámicamente si el procesamiento de vídeo HDR mejoraría la captura multimedia y, si es así, habilita el vídeo HDR. Para determinar si se admite un modo determinado en el dispositivo actual, compruebe si la colección HdrVideoControl.SupportedModes contiene el modo deseado.

Habilite o deshabilite el procesamiento de vídeo HDR estableciendo HdrVideoControl.Mode en el modo deseado. Este control requiere que la secuencia esté en un estado detenido antes de establecer el modo, consulte 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;
}

Prioridad de exposición

ExposurePriorityVideoControl, cuando está habilitado, evalúa los fotogramas de vídeo del dispositivo de captura para determinar si el vídeo está capturando una escena de poca luz. Si es así, el control reduce la velocidad de fotogramas del vídeo capturado para aumentar el tiempo de exposición de cada fotograma y mejorar la calidad visual del vídeo capturado.

Determine si el control de prioridad de exposición es compatible con el dispositivo actual comprobando la propiedad ExposurePriorityVideoControl.Supported.

Habilite o deshabilite el control de prioridad de exposición estableciendo ExposurePriorityVideoControl.Enabled en el modo deseado.

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

Desaconsegición temporal

A partir de Windows 10, versión 1803, puedes habilitar la desnodización temporal de vídeo en dispositivos compatibles con él. Esta característica fusiona los datos de imagen de varios fotogramas adyacentes en tiempo real para generar fotogramas de vídeo que tengan menos ruido visual.

VideoTemporalesDenoisingControl permite a la aplicación determinar si se admite la desnodización temporal en el dispositivo actual y, si es así, qué modos de desaplicación se admiten. Los modos de desactivación disponibles son Desactivado, Activado y Automático. Es posible que un dispositivo no admita todos los modos, pero todos los dispositivos deben ser compatibles con Encendido y Apagado automático.

En el ejemplo siguiente se usa una interfaz de usuario sencilla para proporcionar botones de radio que permiten al usuario cambiar entre modos de desactivación.

<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>

En el método siguiente, se comprueba la propiedad VideoTemporalesDenoisingControl.Supported para ver si se admite la desnodización temporal en absoluto en el dispositivo actual. Si es así, comprobamos para asegurarnos de que se admite Off y Auto o On , en cuyo caso hacemos que nuestros botones de radio sean visibles. A continuación, los botones Auto y On se hacen visibles si se admiten esos métodos.

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;
            }
        }
    }
}

En el controlador de eventos Checked para los botones de radio, se activa el nombre del botón y se establece el modo correspondiente estableciendo la propiedad VideoTemporalesDenoisingControl.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;
    }
}

Deshabilitación de la desactivación temporal durante el procesamiento de fotogramas

El vídeo que se ha procesado mediante la desaplicación temporal puede ser más agradable para el ojo humano. Sin embargo, dado que la desasignación temporal puede afectar a la coherencia de la imagen y reducir la cantidad de detalles en el marco, las aplicaciones que realizan el procesamiento de imágenes en los fotogramas, como el registro o el reconocimiento óptico de caracteres, pueden querer deshabilitar mediante programación la desasignación cuando se habilita el procesamiento de imágenes.

En el ejemplo siguiente se determina qué modos de desaplicación se admiten y almacena esta información en algunas variables de clase.

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;
        }
    }

}

Cuando la aplicación habilita el procesamiento de fotogramas, establece el modo de anotación en Desactivado si se admite ese modo para que el procesamiento de fotogramas pueda usar fotogramas sin procesar que no se han anotado.

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

    _isProcessing = true;
}

Cuando la aplicación deshabilita el procesamiento de fotogramas, establece el modo de anotación en Activado o Automático, en función del modo que se admita.

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;
    }
}

Para obtener más información sobre cómo obtener fotogramas de vídeo para el procesamiento de imágenes, vea Procesar fotogramas multimedia con MediaFrameReader.