Video yakalama için el ile kamera denetimleri

Bu makalede HDR video ve pozlama önceliği dahil olmak üzere gelişmiş video yakalama senaryolarını etkinleştirmek için el ile cihaz denetimlerinin nasıl kullanılacağı gösterilmektedir.

Bu makalede açıklanan video cihazı denetimlerinin tümü aynı desen kullanılarak uygulamanıza eklenir. İlk olarak, uygulamanızın çalıştığı geçerli cihazda denetimin desteklenip desteklenmediğini denetleyin. Denetim destekleniyorsa, denetim için istenen modu ayarlayın. Genellikle, geçerli cihazda belirli bir denetim desteklenmiyorsa, kullanıcının özelliği etkinleştirmesine izin veren kullanıcı arabirimi öğesini devre dışı bırakmanız veya gizlemeniz gerekir.

Uyarı

Bu makale, temel fotoğraf ve video yakalamayı uygulama adımlarını açıklayan MediaCapture ile Temel fotoğraf, video ve ses yakalama makalesinde ele alınan kavramlar ve kodlar üzerine derlenmiştir. Daha gelişmiş yakalama senaryolarına geçmeden önce bu makaledeki temel medya yakalama desenini öğrenmenizi öneririz. Bu makaledeki kod, uygulamanızın zaten düzgün bir şekilde başlatılmış bir MediaCapture örneğine sahip olduğunu varsayar.

HDR video

Yüksek dinamik aralıklı (HDR) video özelliği, yakalama cihazının video akışına HDR işleme uygular. HdrVideoControl.Supported özelliğini seçerek HDR videonun desteklenip desteklenmediğini belirleyin.

HDR video denetimi üç modu destekler: açık, kapalı ve otomatik, yani cihaz HDR video işlemenin medya yakalamayı geliştirip geliştirmeyeceğini dinamik olarak belirler ve öyleyse HDR videoyu etkinleştirir. Geçerli cihazda belirli bir modun desteklenip desteklenmediğini belirlemek için HdrVideoControl.SupportedModes koleksiyonunun istenen modu içerip içermediğini denetleyin.

HdrVideoControl.Mode ayarını istenen moda ayarlayarak HDR video işlemeyi etkinleştirin veya devre dışı bırakın. Bu denetim, modu ayarlamadan önce akışın durdurulmuş durumda olmasını gerektirir, bkz. 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;
}

Maruz kalma önceliği

ExposurePriorityVideoControl, etkinleştirildiğinde, videonun düşük ışıklı bir sahne yakalayıp yakalamadığını belirlemek için yakalama cihazından video karelerini değerlendirir. Bu durumda denetim, her karenin pozlama süresini artırmak ve yakalanan videonun görsel kalitesini artırmak için yakalanan videonun kare hızını düşürür.

ExposurePriorityVideoControl.Supported özelliğini denetleyerek geçerli cihazda pozlama önceliği denetiminin desteklenip desteklenmediğini belirleyin.

ExposurePriorityVideoControl.Enabled ayarını istediğiniz moda ayarlayarak pozlama önceliği denetimini etkinleştirin veya devre dışı bırakın.

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

Zamansal gürültü azaltma

Windows 10, sürüm 1803'den başlayarak, videoyu destekleyen cihazlarda zamansal olarak ayırmayı etkinleştirebilirsiniz. Bu özellik, birden çok bitişik karedeki görüntü verilerini gerçek zamanlı olarak birleştirerek daha az görsel gürültüsü olan video kareleri oluşturur.

VideoTemporalDenoisingControl, uygulamanızın geçerli cihazda zamansal gürültü gidermenin desteklenip desteklenmediğini ve destekleniyorsa hangi gürültü giderme modlarının desteklendiğini belirlemesini sağlar. Kullanılabilir ayırma modları Kapalı, Açık ve Otomatik'tır. Bir cihaz tüm modları desteklemeyebilir, ancak her cihazın Otomatik veya Açık ve Kapalı'yı desteklemesi gerekir.

Aşağıdaki örnek, kullanıcının gürültü giderme modları arasında geçiş yapmasına olanak sağlayan radyo butonları sağlamak için basit bir kullanıcı arabirimi kullanır.

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

Aşağıdaki yöntemde, geçerli cihazda zamansal gürültü giderme desteğinin olup olmadığını görmek için VideoTemporalDenoisingControl.Supported özelliği kontrol edilmektedir. Bu durumda Kapalı ve Otomatik veya Açık'ın desteklendiğinden emin olup olmadığını kontrol ederiz. Bu durumda radyo düğmelerimizi görünür hale getiririz. Ardından, bu yöntemler destekleniyorsa Otomatik ve Açık düğmeleri görünür hale getirilir.

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

Radyo düğmeleri için İşaretli olay işleyicisinde, düğmenin adı işaretlenir ve VideoTemporalDenoisingControl.Mode özelliği ayarlanarak ilgili mod ayarlanır.

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

- Çerçeveleri işlerken zamansal gürültü azaltmayı devre dışı bırakma

Zamansal gürültü giderme kullanılarak işlenen video, insan gözü için daha göz alıcı olabilir. Bununla birlikte, zamansal gürültü azaltma görüntü tutarlılığını etkileyebilir ve çerçevedeki ayrıntı miktarını azaltabilir, bu nedenle kayıt veya optik karakter tanıma gibi çerçevelerde görüntü işleme gerçekleştiren uygulamalar, görüntü işleme etkinleştirildiğinde gürültü azaltmayı programlı olarak devre dışı bırakmak isteyebilir.

Aşağıdaki örnek hangi ayırma modlarının destekleneceğini belirler ve bu bilgileri bazı sınıf değişkenlerinde depolar.

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

}

Uygulama çerçeve işlemeyi etkinleştirdiğinde, bu mod destekleniyorsa, ayırma modunu Kapalı olarak ayarlar, böylece çerçeve işleme, paylanmamış ham çerçeveleri kullanabilir.

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

    _isProcessing = true;
}

Uygulama çerçeve işlemeyi devre dışı bırakdığında, hangi modun desteklendiğine bağlı olarak, ayırma modunu Açık veya Otomatik olarak ayarlar.

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

Görüntü işleme için video kareleri alma hakkında daha fazla bilgi için bkz . MediaFrameReader ile medya çerçevelerini işleme.