Condividi tramite


Controlli della fotocamera manuali per l'acquisizione di 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à.

Tutte le API di controllo del dispositivo descritte in questo articolo sono membri dello spazio dei nomi Windows.Media.Devices.

using Windows.Media.Devices;

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 necessari 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 allo stream 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 l'insieme HdrVideoControl.SupportedModes contiene la modalità desiderata.

Abilitare o disabilitare l'elaborazione video HDR impostando 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 (!_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;
}

Priorità di esposizione

ExposurePriorityVideoControl, se abilitata, valuta i fotogrammi video dal dispositivo di acquisizione per determinare se il video sta acquisendo una scena a bassa luminosità. 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 nel dispositivo corrente controllando la proprietà ExposurePriorityVideoControl.Supported.

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

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

Denoising temporale

A partire da Windows 10, versione 1803, si può abilitare il denoising 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.

VideoTemporalDenoisingControl consente all'app di determinare se la denoizzazione temporale è supportata nel dispositivo corrente e, in tal caso, quali modalità di denoising sono supportate. Le modalità di denoizzazione disponibili sono Off, On, and Auto. Un dispositivo potrebbe non supportare tutte le modalità, ma ogni dispositivo deve supportare Auto 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="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>

Nel metodo seguente viene verificata la proprietà VideoTemporalDenoisingControl.Supported per verificare se il denoising temporale è supportata nel dispositivo corrente. In tal caso, si verifica che Off e Auto o On sia supportato, nel qual caso i pulsanti di opzione vengono visualizzati. Successivamente, i pulsanti Auto e On vengono resi visibili se tali metodi sono supportati.

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

Nel gestore di eventi Checked per i pulsanti di opzione viene selezionato il nome del pulsante e la modalità corrispondente viene impostata impostando la proprietà 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;
    }
}

Disabilitazione della denoizzazione temporale durante l'elaborazione dei frame

Il video che è stato elaborato utilizzando la denoizzazione temporale può essere più piacevole 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 il denoising quando l'elaborazione delle immagini è abilitata.

L'esempio seguente determina quali modalità di denoising 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 (_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 l'app abilita l'elaborazione dei fotogrammi, imposta la modalità denoising su Off se tale modalità è supportata in modo che l'elaborazione dei fotogrammi possa utilizzare fotogrammi non elaborati che non sono stati sottoposti a denoising.

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

    _isProcessing = true;
}

Quando l'app disabilita l'elaborazione dei fotogrammi, imposta la modalità di denoizzazione 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)
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
    }
}

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