Partilhar via


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

Este artigo mostra-lhe como usar controlos manuais do dispositivo para ativar cenários melhorados de captura de vídeo, incluindo vídeo HDR e prioridade de exposição.

Os controlos do dispositivo de vídeo discutidos neste artigo são todos adicionados à sua aplicação usando o mesmo padrão. Primeiro, verifique se o controlo é suportado no dispositivo atual onde a sua aplicação está a correr. Se o controlo tiver suporte, defina o modo desejado para o controlo. Normalmente, se um determinado controlo não for suportado no dispositivo atual, deve desativar ou ocultar o elemento da interface que permite ao utilizador ativar a funcionalidade.

Observação

Este artigo baseia-se em conceitos e código discutidos em Captura básica de fotografia, vídeo e áudio com MediaCapture, que descreve os passos para implementar a captura básica de fotografia e vídeo. Recomendamos que se familiarize com o padrão básico de captura de media nesse artigo antes de avançar para cenários de captura mais avançados. O código deste artigo assume que a sua aplicação já tem uma instância de MediaCapture que foi devidamente inicializada.

Vídeo HDR

A funcionalidade de vídeo de alta gama dinâmica (HDR) aplica processamento HDR ao fluxo de vídeo do dispositivo de captura. Determine se o vídeo HDR é suportado selecionando a propriedade HdrVideoControl.Supported .

O controlo de vídeo HDR suporta três modos: ligado, desligado e automático, o que significa que o dispositivo determina dinamicamente se o processamento de vídeo HDR melhoraria a captura de media e, em caso afirmativo, permite vídeo HDR. Para determinar se um modo específico é suportado no dispositivo atual, verifique se a coleção HdrVideoControl.SupportedModes contém o modo desejado.

Ative ou desative o processamento de vídeo HDR definindo o HdrVideoControl.Mode para o modo desejado. Este controlo exige que o fluxo esteja num estado parado antes de o modo ser definido, ver KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR.

private void SetHdrVideoMode(HdrVideoMode mode)
{
    if (!m_mediaCapture.VideoDeviceController.HdrVideoControl.Supported)
    {
        tbStatus.Text = "HDR Video not available";
        return;
    }

    var hdrVideoModes = m_mediaCapture.VideoDeviceController.HdrVideoControl.SupportedModes;

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

    m_mediaCapture.VideoDeviceController.HdrVideoControl.Mode = mode;
}

Prioridade de exposição

O ExposurePriorityVideoControl, quando ativado, avalia os fotogramas de vídeo do dispositivo de captura para determinar se o vídeo está a captar uma cena com pouca luz. Se sim, o controlo reduz a taxa de fotogramas do vídeo capturado para aumentar o tempo de exposição de cada fotograma e melhorar a qualidade visual do vídeo captado.

Determine se o controlo de prioridade de exposição é suportado no dispositivo atual verificando a propriedade ExposurePriorityVideoControl.Supported.

Ative ou desative o controlo de prioridade de exposição definindo o ExposurePriorityVideoControl.Enabled para o estado desejado.

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

Redução de ruído temporal

A partir do Windows 10, versão 1803, pode ativar a redução temporal de ruído para vídeo em dispositivos que a suportem. Esta funcionalidade funde os dados de imagem de múltiplos fotogramas adjacentes em tempo real para produzir fotogramas de vídeo com menos ruído visual.

O VideoTemporalDenoisingControl permite que a sua aplicação determine se a redução de ruído temporal é suportada no dispositivo atual e, se for o caso, quais os modos de redução de ruído são suportados. Os modos de redução de ruído disponíveis são Desligado, Ligado e Auto. Um dispositivo pode não suportar todos os modos, mas todos devem suportar Auto ou Ligado e Desligado.

O exemplo seguinte utiliza uma interface simples para fornecer botões de acesso que permitem ao utilizador alternar entre modos de redução de ruído.

<StackPanel Orientation="Vertical" HorizontalAlignment="Right" >
    <StackPanel x:Name="spDenoise" Visibility="Collapsed">
        <TextBlock>Temporal Denoising</TextBlock>
        <RadioButton x:Name="rbDenoiseOff" Checked="rbDenoise_Checked"
            GroupName="Denoise Group" Content="Off"/>
        <RadioButton x:Name="rbDenoiseOn" Checked="rbDenoise_Checked"
            GroupName="Denoise Group" Content="On" Visibility="Collapsed"/>
        <RadioButton x:Name="rbDenoiseAuto" Checked="rbDenoise_Checked"
            GroupName="Denoise Group" Content="Auto" Visibility="Collapsed"/>
    </StackPanel>
</StackPanel>

No método seguinte, verifica-se a propriedade VideoTemporalDenoisingControl.Supported para verificar se a redução temporal de ruído é suportada no dispositivo atual. Se sim, verificamos se Off e Auto ou On são suportados, caso em que tornamos os nossos botões de rádio visíveis. De seguida, os botões Auto e On ficam visíveis se esses métodos forem suportados.

private void bUpdateDenoiseCapabilities_Click(object sender, RoutedEventArgs e)
{
    if (m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
    {
         IReadOnlyList<VideoTemporalDenoisingMode> modes = m_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)))
        {
            spDenoise.Visibility = Visibility.Visible;

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

No handler de eventos Selecionado para os botões de rádio, o nome do botão é verificado e o modo correspondente é configurado ao definir a propriedade VideoTemporalDenoisingControl.Mode.

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

Desativar a redução de ruído temporal durante o processamento de frames

O vídeo processado usando a 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 frame, aplicações que realizam processamento de imagem nos frames, como registo ou reconhecimento ótico de caracteres, podem querer desativar programaticamente a redução de ruído quando o processamento de imagem está ativado.

O exemplo seguinte determina quais os modos de redução de ruído suportados e armazena esta informação 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 (m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
    {
        // Query support for the VideoTemporalDenoising control Off mode
        _isVideoTemporalDenoisingOffSupported = m_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 (m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
        {
            _videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
            m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
        }
        else if (m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
        {
            _videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.Auto;
            m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
        }
    }

}

Quando a aplicação ativa o processamento de frames, define o modo de redução de ruído para Desligado , se esse modo for suportado, para que o processamento de frames possa usar frames brutos que não foram desruidos.

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

    _isProcessing = true;
}

Quando a aplicação desativa o processamento de frames, define o modo de redução de ruído para Ligado ou Automático, dependendo do modo suportado.

public void DisableFrameProcessing()
{
    _isProcessing = false;

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

Para mais informações sobre como obter fotogramas de vídeo para processamento de imagem, consulte Processar fotogramas de media com o MediaFrameReader.