Controles manuais da câmera para captura de vídeo

Este artigo mostra como usar controles manuais de dispositivo para habilitar cenários de captura de vídeo aprimorados, incluindo vídeo HDR e prioridade de exposição.

Os controles de dispositivo de vídeo discutidos neste artigo são todos adicionados ao seu aplicativo usando o mesmo padrão. Primeiro, verifique se o controle é compatível com o dispositivo atual no qual seu aplicativo está sendo executado. Se o controle for suportado, defina o modo desejado para o controle. Normalmente, se um controle específico não tiver suporte no dispositivo atual, você deverá desabilitar ou ocultar o elemento da interface do usuário que permite ao usuário habilitar o recurso.

Todas as APIs de controle de dispositivo abordadas neste artigo são membros do namespace Windows.Media.Devices.

using Windows.Media.Devices;

Observação

Este artigo se baseia em conceitos e códigos discutidos em Captura básica de fotos, áudio e vídeo com o MediaCapture, que descreve as etapas para implementar uma captura básica de fotos e vídeos. Recomendamos que você se familiarize com o padrão de captura de mídia básica neste artigo antes de passar para cenários de captura mais avançados. O código neste artigo presume que seu aplicativo já tenha uma instância de MediaCapture inicializada corretamente.

Vídeo HDR

O recurso de vídeo HDR (High Dynamic Range) aplica o processamento HDR ao fluxo de vídeo do dispositivo de captura. Determine se há suporte para vídeo HDR selecionando a propriedade HdrVideoControl.Supported.

O controle de vídeo HDR oferece suporte a três modos: ativado, desativado e automático, o que significa que o dispositivo determina dinamicamente se o processamento de vídeo HDR melhoraria a captura de mídia e, em caso afirmativo, habilita o vídeo HDR. Para determinar se há suporte para um modo específico no dispositivo atual, verifique se a coleção HdrVideoControl.SupportedModes contém o modo desejado.

Habilite ou desabilite o processamento de vídeo HDR definindo o HdrVideoControl.Mode para o modo desejado. Esse controle requer que o fluxo esteja em um estado parado antes que o modo seja definido, 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;
}

Prioridade de exposição

O ExposurePriorityVideoControl, quando habilitado, avalia os quadros de vídeo do dispositivo de captura para determinar se o vídeo está capturando uma cena com pouca luz. Nesse caso, o controle reduz a taxa de quadros do vídeo capturado para aumentar o tempo de exposição de cada quadro e melhorar a qualidade visual do vídeo capturado.

Determine se o controle de prioridade de exposição é compatível com o dispositivo atual verificando a propriedade ExposurePriorityVideoControl.Supported.

Ative ou desative o controle de prioridade de exposição definindo o ExposurePriorityVideoControl.Enabled para o modo desejado.

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

Redução de ruído temporal

A partir do Windows 10, versão 1803, você pode habilitar a redução de ruído temporal para vídeo em dispositivos que dão suporte a ele. Esse recurso funde os dados de imagem de vários quadros adjacentes em tempo real para produzir quadros de vídeo com menos ruído visual.

O VideoTemporalDenoisingControl permite que seu aplicativo determine se há suporte para redução de ruído temporal no dispositivo atual e, em caso afirmativo, quais modos de redução de ruído têm suporte. Os modos de redução de ruído disponíveis são Desligado, Ativado e Automático. Um dispositivo pode não dar suporte a todos os modos, mas todos os dispositivos devem dar suporte a Automático ou Ligado e Desligado.

O exemplo a seguir usa uma interface do usuário simples para fornecer botões de opção, permitindo que o usuário alterne entre os modos de redução de ruído.

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

No método a seguir, a propriedade VideoTemporalDenoisingControl.Supported é verificada para ver se há suporte para a remoção de ruído temporal no dispositivo atual. Nesse caso, verificamos se Desligado e Automático ou Ligado são suportados, caso em que tornamos nossos botões de opção visíveis. Em seguida, os botões Auto e On ficam visíveis se esses métodos forem suportados.

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

No manipulador de eventos Checked para os botões de opção, o nome do botão é verificado e o modo correspondente é definido definindo a propriedade 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;
    }
}

Desativando a redução de ruído temporal durante o processamento de quadros

O vídeo que foi processado usando redução de ruído temporal pode ser mais agradável ao olho humano. No entanto, como a redução de ruído temporal pode afetar a consistência da imagem e diminuir a quantidade de detalhes no quadro, os aplicativos que executam o processamento de imagem nos quadros, como registro ou reconhecimento óptico de caracteres, podem querer desabilitar programaticamente a redução de ruído quando o processamento de imagem estiver habilitado.

O exemplo a seguir determina quais modos de redução de ruído são suportados e armazena essas informações em algumas variáveis de classe.

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

}

Quando o aplicativo habilita o processamento de quadros, ele define o modo de redução de ruído como Desativado se esse modo for compatível para que o processamento de quadros possa usar quadros brutos que não foram removidos de ruído.

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

    _isProcessing = true;
}

Quando o aplicativo desabilita o processamento de quadros, ele define o modo de redução de ruído como Ativado ou Automático, dependendo de qual modo é compatível.

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 obter mais informações sobre como obter quadros de vídeo para processamento de imagem, consulte Processar quadros de mídia com MediaFrameReader.