Condividi tramite


Effetti per l'analisi dei fotogrammi della fotocamera

Questo articolo descrive come usare SceneAnalysisEffect e FaceDetectionEffect per analizzare il contenuto del flusso di anteprima dell'acquisizione multimediale.

Effetto di analisi della scena

SceneAnalysisEffect analizza i fotogrammi video nel flusso di anteprima dell'acquisizione multimediale e consiglia opzioni di elaborazione per migliorare il risultato dell'acquisizione. Attualmente, l'effetto supporta il rilevamento del miglioramento dell'acquisizione tramite l'elaborazione HDR (High Dynamic Range).

Se l'effetto consiglia di usare HDR, è possibile farlo nei modi seguenti:

Spazi dei nomi di analisi della scena

Per usare l'analisi della scena, l'app deve includere gli spazi dei nomi seguenti oltre agli spazi dei nomi necessari per l'acquisizione multimediale di base.

using Windows.Media.Core;
using Windows.Media.Devices;

Inizializzare l'effetto di analisi della scena e aggiungerlo al flusso di anteprima

Gli effetti video vengono implementati usando due API, una definizione di effetto, che fornisce impostazioni che il dispositivo di acquisizione deve inizializzare l'effetto e un'istanza dell'effetto, che può essere usata per controllare l'effetto. Poiché può essere necessario accedere all'istanza dell'effetto da più posizioni all'interno del codice, è in genere necessario dichiarare una variabile membro per contenere l'oggetto.

private SceneAnalysisEffect _sceneAnalysisEffect;

Nell'app, dopo aver inizializzato l'oggetto MediaCapture, creare una nuova istanza di SceneAnalysisEffectDefinition.

Registrare l'effetto con il dispositivo di acquisizione chiamando AddVideoEffectAsync sull'oggetto MediaCapture, fornendo SceneAnalysisEffectDefinition e specificando MediaStreamType.VideoPreview per indicare che l'effetto deve essere applicato al flusso di anteprima video, anziché al flusso di acquisizione. AddVideoEffectAsync restituisce un'istanza dell'effetto aggiunto. Poiché questo metodo può essere usato con più tipi di effetto, è necessario eseguire il cast dell'istanza restituita in un oggetto SceneAnalysisEffect.

Per ricevere i risultati dell'analisi della scena, è necessario registrare un gestore per l'evento SceneAnalyzed.

Attualmente, l'effetto di analisi della scena include solo l'analizzatore a intervalli dinamici elevati. Abilitare l'analisi HDR impostando HighDynamicRangeControl.Enabled dell'effetto su true.

// Create the definition
var definition = new SceneAnalysisEffectDefinition();

// Add the effect to the video record stream
_sceneAnalysisEffect = (SceneAnalysisEffect)await _mediaCapture.AddVideoEffectAsync(definition, MediaStreamType.VideoPreview);

// Subscribe to notifications about scene information
_sceneAnalysisEffect.SceneAnalyzed += SceneAnalysisEffect_SceneAnalyzed;

// Enable HDR analysis
_sceneAnalysisEffect.HighDynamicRangeAnalyzer.Enabled = true;

Implementare il gestore eventi SceneAnalyzed

I risultati dell'analisi della scena vengono restituiti nel gestore eventi SceneAnalyzed. L'oggetto SceneAnalyzedEventArgs passato al gestore ha un oggetto SceneAnalysisEffectFrame che ha un oggetto HighDynamicRangeOutput. La proprietà Certezza dell'output di intervallo dinamico elevato fornisce un valore compreso tra 0 e 1,0, dove 0 indica che l'elaborazione HDR non contribuirebbe a migliorare il risultato dell'acquisizione e 1,0 indica che l'elaborazione HDR sarebbe utile. Puoi decidere il punto di soglia in cui vuoi usare HDR o mostrare i risultati all'utente e consenti all'utente di decidere.

private void SceneAnalysisEffect_SceneAnalyzed(SceneAnalysisEffect sender, SceneAnalyzedEventArgs args)
{
    double hdrCertainty = args.ResultFrame.HighDynamicRange.Certainty;
    
    // Certainty value is between 0.0 and 1.0
    if(hdrCertainty > MyCertaintyCap)
    {
        ShowMessageToUser("Enabling HDR capture is recommended.");
    }
}

L'oggetto HighDynamicRangeOutput passato nel gestore ha anche una proprietà FrameControllers che contiene controller di fotogrammi suggeriti per l'acquisizione di una sequenza di foto variabile per l'elaborazione HDR. Per ulteriori informazioni, consultate Sequenza di foto variabile.

Pulire l'effetto di analisi della scena

Al termine dell'acquisizione dell'app, prima di eliminare l'oggetto MediaCapture si deve disabilitare l'effetto di analisi della scena impostando la proprietà HighDynamicRangeAnalyzer.Enabled su false e annulla la registrazione del gestore eventi SceneAnalyzed. Chiamare MediaCapture.ClearEffectsAsync, specificando il flusso di anteprima video perché era il flusso a cui è stato aggiunto l'effetto. Impostare infine la variabile membro su Null.

// Disable detection
_sceneAnalysisEffect.HighDynamicRangeAnalyzer.Enabled = false;

_sceneAnalysisEffect.SceneAnalyzed -= SceneAnalysisEffect_SceneAnalyzed;

// Remove the effect from the preview stream
await _mediaCapture.ClearEffectsAsync(MediaStreamType.VideoPreview);

// Clear the member variable that held the effect instance
_sceneAnalysisEffect = null;

Effetto rilevamento viso

FaceDetectionEffect identifica la posizione dei visi all'interno del flusso di anteprima dell'acquisizione multimediale. L'effetto consente di ricevere una notifica ogni volta che viene rilevato un viso nel flusso di anteprima e fornisce il rettangolo di selezione per ogni viso rilevato all'interno del frame di anteprima. Nei dispositivi supportati, l'effetto rilevamento viso fornisce anche un'esposizione avanzata e lo stato attivo sul viso più importante nella scena.

Spazi dei nomi di rilevamento dei volti

Per usare il rilevamento visi, l'app deve includere gli spazi dei nomi seguenti oltre agli spazi dei nomi necessari per l'acquisizione multimediale di base.

using Windows.Media.Core;

Inizializzare l'effetto di rilevamento del viso e aggiungerlo al flusso di anteprima

Gli effetti video vengono implementati usando due API, una definizione di effetto, che fornisce impostazioni che il dispositivo di acquisizione deve inizializzare l'effetto e un'istanza dell'effetto, che può essere usata per controllare l'effetto. Poiché può essere necessario accedere all'istanza dell'effetto da più posizioni all'interno del codice, è in genere necessario dichiarare una variabile membro per contenere l'oggetto.

FaceDetectionEffect _faceDetectionEffect;

Nell'app, dopo aver inizializzato l'oggetto MediaCapture, creare una nuova istanza di FaceDetectionEffectDefinition. Impostare la proprietà DetectionMode per classificare in ordine di priorità il rilevamento dei volti più veloce o più accurato. Impostare SynchronousDetectionEnabled per specificare che i fotogrammi in ingresso non vengono ritardati in attesa del completamento del rilevamento dei volti, perché ciò può comportare un'esperienza di anteprima irregolare.

Registrare l'effetto con il dispositivo di acquisizione chiamando AddVideoEffectAsync sull'oggetto MediaCapture, fornendo FaceDetectionEffectDefinition e specificando MediaStreamType.VideoPreview per indicare che l'effetto deve essere applicato al flusso di anteprima video, anziché al flusso di acquisizione. AddVideoEffectAsync restituisce un'istanza dell'effetto aggiunto. Poiché questo metodo può essere usato con più tipi di effetto, è necessario eseguire il cast dell'istanza restituita in un oggetto FaceDetectionEffect.

Abilitare o disabilitare l'effetto impostando la proprietà FaceDetectionEffect.Enabled. Regolare la frequenza con cui l'effetto analizza i fotogrammi impostando la proprietà FaceDetectionEffect.DesiredDetectionInterval. Entrambe queste proprietà possono essere modificate mentre l'acquisizione multimediale è in corso.


// Create the definition, which will contain some initialization settings
var definition = new FaceDetectionEffectDefinition();

// To ensure preview smoothness, do not delay incoming samples
definition.SynchronousDetectionEnabled = false;

// In this scenario, choose detection speed over accuracy
definition.DetectionMode = FaceDetectionMode.HighPerformance;

// Add the effect to the preview stream
_faceDetectionEffect = (FaceDetectionEffect)await _mediaCapture.AddVideoEffectAsync(definition, MediaStreamType.VideoPreview);

// Choose the shortest interval between detection events
_faceDetectionEffect.DesiredDetectionInterval = TimeSpan.FromMilliseconds(33);

// Start detecting faces
_faceDetectionEffect.Enabled = true;

Ricevere notifiche quando vengono rilevati visi

Se si desidera eseguire un'azione quando vengono rilevati visi, ad esempio disegnando una casella intorno ai visi rilevati nell'anteprima video, è possibile registrarsi per l'evento FaceDetected.

// Register for face detection events
_faceDetectionEffect.FaceDetected += FaceDetectionEffect_FaceDetected;

Nel gestore per l'evento è possibile ottenere un elenco di tutti i visi rilevati in un frame accedendo alla proprietà FaceDetectionEffectFrame.DetectedFaces di FaceDetectedEventArgs. La proprietà FaceBox è una struttura BitmapBounds che descrive il rettangolo contenente il viso rilevato in unità relative alle dimensioni del flusso di anteprima. Per visualizzare il codice di esempio che trasforma le coordinate del flusso di anteprima in coordinate dello schermo, vedi l'esempio UWP rilevamento visi.

private void FaceDetectionEffect_FaceDetected(FaceDetectionEffect sender, FaceDetectedEventArgs args)
{
    foreach (Windows.Media.FaceAnalysis.DetectedFace face in args.ResultFrame.DetectedFaces)
    {
        BitmapBounds faceRect = face.FaceBox;

        // Draw a rectangle on the preview stream for each face
    }
}

Pulire l'effetto di rilevamento viso

Al termine dell'acquisizione dell'app, prima di eliminare l'oggetto MediaCapture si deve disabilitare l'effetto di rilevamento viso con FaceDetectionEffect.Enabled e annullare la registrazione del gestore di eventi FaceDetected se se ne ha registrato uno in precedenza. Chiamare MediaCapture.ClearEffectsAsync, specificando il flusso di anteprima video perché era il flusso a cui è stato aggiunto l'effetto. Impostare infine la variabile membro su Null.

// Disable detection
_faceDetectionEffect.Enabled = false;

// Unregister the event handler
_faceDetectionEffect.FaceDetected -= FaceDetectionEffect_FaceDetected;

// Remove the effect from the preview stream
await _mediaCapture.ClearEffectsAsync(MediaStreamType.VideoPreview);

// Clear the member variable that held the effect instance
_faceDetectionEffect = null;

Verificare il supporto dello stato attivo e dell'esposizione per i visi rilevati

Non tutti i dispositivi hanno un dispositivo di acquisizione che può regolare lo stato attivo e l'esposizione in base ai visi rilevati. Poiché il rilevamento dei visi utilizza le risorse del dispositivo, è possibile abilitare il rilevamento dei visi solo nei dispositivi che possono usare la funzionalità per migliorare l'acquisizione. Per verificare se l'ottimizzazione dell'acquisizione basata sul viso è disponibile, ottenere VideoDeviceController per MediaCapture inizializzato e quindi ottenere RegionsOfInterestControl del controller del dispositivo video. Verificare se MaxRegions supporta almeno un'area. Controllare quindi se AutoExposureSupported o AutoFocusSupported sono true. Se queste condizioni vengono soddisfatte, il dispositivo può sfruttare il rilevamento dei visi per migliorare l'acquisizione.

var regionsControl = _mediaCapture.VideoDeviceController.RegionsOfInterestControl;
bool faceDetectionFocusAndExposureSupported =
    regionsControl.MaxRegions > 0 &&
    (regionsControl.AutoExposureSupported || regionsControl.AutoFocusSupported);