Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.
Tópicos relacionados
Windows developer