Condividi tramite


Controlli manuali della fotocamera per l'acquisizione video

Questo articolo illustra come usare i controlli manuali dei dispositivi per abilitare scenari avanzati di acquisizione video, tra cui video HDR e priorità di esposizione.

I controlli del dispositivo video descritti in questo articolo vengono tutti aggiunti all'app usando lo stesso modello. Prima di tutto, verificare se il controllo è supportato nel dispositivo corrente in cui è in esecuzione l'app. Se il controllo è supportato, impostare la modalità desiderata per il controllo . In genere, se un particolare controllo non è supportato nel dispositivo corrente, è necessario disabilitare o nascondere l'elemento dell'interfaccia utente che consente all'utente di abilitare la funzionalità.

Nota

Questo articolo si basa sui concetti e sul codice descritti in acquisizione di foto, video e audio di base con MediaCapture, che descrive i passaggi per implementare l'acquisizione di foto e video di base. È consigliabile acquisire familiarità con il modello di acquisizione multimediale di base in questo articolo prima di passare a scenari di acquisizione più avanzati. Il codice in questo articolo presuppone che l'app abbia già un'istanza di MediaCapture che è stata inizializzata correttamente.

Video HDR

La funzionalità video HDR (High Dynamic Range) applica l'elaborazione HDR al flusso video del dispositivo di acquisizione. Determinare se il video HDR è supportato selezionando la proprietà HdrVideoControl.Supported.

Il controllo video HDR supporta tre modalità: on, off e automatic, il che significa che il dispositivo determina in modo dinamico se l'elaborazione video HDR migliorerebbe l'acquisizione multimediale e, in tal caso, abilita video HDR. Per determinare se una particolare modalità è supportata nel dispositivo corrente, verificare se la raccolta HdrVideoControl.SupportedModes contiene la modalità desiderata.

Abilitare o disabilitare l'elaborazione video HDR impostando il hdrVideoControl.Mode sulla modalità desiderata. Questo controllo richiede che il flusso si trova in uno stato arrestato prima che venga impostata la modalità, vedere 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;
}

Priorità di esposizione

La ExposurePriorityVideoControl, se abilitata, valuta i frame video dal dispositivo di acquisizione per determinare se il video sta acquisendo una scena in condizioni di scarsa illuminazione. In tal caso, il controllo riduce la frequenza dei fotogrammi del video acquisito per aumentare il tempo di esposizione per ogni fotogramma e migliorare la qualità visiva del video acquisito.

Determinare se il controllo priorità di esposizione è supportato sul dispositivo attuale controllando la proprietà ExposurePriorityVideoControl.Supported.

Abilitare o disabilitare il controllo priorità di esposizione impostando il ExposurePriorityVideoControl.Enabled sulla modalità desiderata.

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

Denoizzazione temporale

A partire da Windows 10, versione 1803, puoi abilitare la denoizzazione temporale per i video nei dispositivi che lo supportano. Questa funzionalità combina i dati dell'immagine da più fotogrammi adiacenti in tempo reale per produrre fotogrammi video con meno rumore visivo.

La VideoTemporalDenoisingControl consente all'app di stabilire se la riduzione del rumore temporale è supportata sul dispositivo corrente e, in tal caso, quali modalità di riduzione del rumore sono disponibili. Le modalità di denoizzazione disponibili sono Off, One Auto. Un dispositivo potrebbe non supportare tutte le modalità, ma ogni dispositivo deve supportare automatica o On e Off.

Nell'esempio seguente viene usata una semplice interfaccia utente per fornire pulsanti di opzione che consentono all'utente di passare da una modalità all'altra.

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

Nel metodo seguente viene verificata la proprietà VideoTemporalDenoisingControl.Supported per verificare se la denoizzazione temporale è supportata nel dispositivo corrente. In tal caso, verifichiamo che Disattivato e Auto o On siano supportati, nel qual caso i pulsanti di opzione vengono visualizzati. Successivamente, i pulsanti di automatico e On vengono resi visibili se tali metodi sono supportati.

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

Nel gestore eventi Checked per i pulsanti radio, il nome del pulsante viene controllato e la modalità corrispondente viene impostata tramite la proprietà 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;
    }
}

Disabilitazione della denoizzazione temporale durante l'elaborazione dei frame

Il video che è stato elaborato utilizzando la riduzione del rumore temporale può essere più gradevole per l'occhio umano. Tuttavia, poiché la denoizzazione temporale può influire sulla coerenza delle immagini e ridurre la quantità di dettagli nel frame, le app che eseguono l'elaborazione delle immagini sui fotogrammi, ad esempio la registrazione o il riconoscimento ottico dei caratteri, possono voler disabilitare a livello di codice la denoizzazione quando l'elaborazione delle immagini è abilitata.

L'esempio seguente determina quali modalità di denoizzazione sono supportate e archivia queste informazioni in alcune variabili di 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 l'app abilita l'elaborazione dei fotogrammi, imposta la modalità di denoizzazione su Off se tale modalità è supportata in modo che l'elaborazione dei fotogrammi possa usare fotogrammi non elaborati che non sono stati denoizzati.

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

    _isProcessing = true;
}

Quando l'app disabilita l'elaborazione dei fotogrammi, imposta la modalità di riduzione del rumore su On o Auto, a seconda della modalità supportata.

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

Per altre informazioni su come ottenere fotogrammi video per l'elaborazione di immagini, vedere Elaborare fotogrammi multimediali con MediaFrameReader.