Effekte für die Analyse von Kamera-Frames

Dieser Artikel beschreibt, wie Sie mit SceneAnalysisEffect und FaceDetectionEffect den Inhalt des Vorschaudatenstroms der Medienaufnahme analysieren.

Effekt der Szenenanalyse

Die SceneAnalysisEffect-Klasse analysiert die Videoframes im Vorschaudatenstrom der Medienaufnahme und empfiehlt Verarbeitungsoptionen zur Verbesserung des Aufnahmeergebnisses. Der Effekt ermittelt derzeit, ob die Verwendung der HDR-Verarbeitung (High Dynamic Range) die Aufnahme verbessern würde.

Wenn der Effekt die Verwendung von HDR empfiehlt, können Sie dies auf folgende Weise tun:

Namespaces der Szenenanalyse

Um die Szenenanalyse verwenden zu können, muss Ihre App zusätzlich zu den für die grundlegende Medienaufnahme erforderlichen Namespaces die folgenden Namespaces enthalten.

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

Initialisieren und Hinzufügen des Szenenanalyseneffekts zum Vorschaudatenstrom

Videoeffekte werden mit zwei APIs, einer Effektdefinition, die die für das Aufnahmegerät benötigten Einstellungen zum Initialisieren des Effekts bereitstellt, und einer Effektinstanz implementiert, die zum Steuern des Effekts verwendet werden kann. Da Sie ggf. von mehreren Stellen innerhalb des Codes aus auf die Effektinstanz zugreifen müssen, sollten Sie in der Regel eine Membervariable als Container für das Objekt deklarieren.

private SceneAnalysisEffect _sceneAnalysisEffect;

Erstellen Sie nach dem Initialisieren des MediaCapture-Objekts in Ihrer App eine neue Instanz der SceneAnalysisEffectDefinition-Klasse.

Registrieren Sie den Effekt mit dem Aufnahmegerät durch Aufrufen der AddVideoEffectAsync-Methode für Ihr MediaCapture-Objekt, stellen Sie SceneAnalysisEffectDefinition bereit, und geben Sie MediaStreamType.VideoPreview an, damit der Effekt im Gegensatz zum Aufnahmedatenstrom auf den Videovorschaudatenstrom angewendet wird. AddVideoEffectAsync gibt eine Instanz des hinzugefügten Effekts zurück. Da diese Methode mit verschiedenen Effekttypen verwendet werden kann, müssen Sie die zurückgegebene Instanz in ein SceneAnalysisEffect-Objekt umwandeln.

Um die Ergebnisse der Szenenanalyse zu erhalten, müssen Sie einen Handler für das SceneAnalyzed-Ereignis registrieren.

Derzeit umfasst der Szenenanalyseeffekt nur die HDR-Analyzer. Aktivieren Sie die HDR-Analyse, indem Sie die HighDynamicRangeControl.Enabled-Eigenschaft des Effekts auf „true“ festlegen.

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

Implementieren des SceneAnalyzed-Ereignishandlers

Die Ergebnisse der Szenenanalyse werden im SceneAnalyzed-Ereignishandler zurückgegeben. Das an den Handler übergebene SceneAnalyzedEventArgs-Objekt verfügt über ein SceneAnalysisEffectFrame-Objekt mit einem HighDynamicRangeOutput-Objekt. Die Certainty-Eigenschaft der HDR-Ausgabe liefert einen Wert zwischen 0 und 1,0, wobei 0 angibt, dass die HDR-Verarbeitung das Aufnahmeergebnis nicht verbessern und 1,0, dass die HDR-Verarbeitung dieses verbessern würde. Sie können den Schwellenwert festlegen, an dem Sie HDR verwenden möchten, oder die Ergebnisse für den Benutzer anzeigen und diesen darüber entscheiden lassen.

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.");
    }
}

Das an den Handler übergebene HighDynamicRangeOutput-Objekt verfügt auch über eine FrameControllers-Eigenschaft, die die vorgeschlagenen Framecontroller für die Aufnahme einer variablen Fotosequenz für HDR-Verarbeitung enthält. Weitere Informationen finden Sie unter Variable Fotosequenz.

Bereinigen des Szenenanalyseeffekts

Wenn Ihre App die Aufnahme abgeschlossen hat, deaktivieren Sie vor dem Löschen des MediaCapture-Objekts den Szenenanalyseeffekt, indem Sie die HighDynamicRangeAnalyzer.Enabled-Eigenschaft des Effekts auf „false“ festlegen und die Registrierung Ihres SceneAnalyzed-Ereignishandlers aufheben. Rufen Sie MediaCapture.ClearEffectsAsync auf, und geben Sie den Videovorschaudatenstrom an, da der Effekt diesem Datenstrom hinzugefügt wurde. Legen Sie schließlich die Membervariable auf NULL fest.

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

Gesichtserkennungseffekt

FaceDetectionEffect identifiziert die Position von Gesichtern innerhalb des Vorschaudatenstroms der Medienaufnahme. Mit dem Effekt erhalten Sie eine Benachrichtigung, wenn ein Gesicht im Vorschaudatenstrom erkannt wird, und es wird der Begrenzungsrahmen für jedes erkannte Gesicht im Vorschauframe bereitgestellt. Auf unterstützten Geräten stellt die Gesichtserkennung auch erweiterte Belichtung und Fokus auf das wichtigste Gesicht in der Szene bereit.

Namespaces der Gesichtserkennung

Um die Gesichtserkennung verwenden zu können, muss Ihre App die folgenden Namespaces zusätzlich zu den für die grundlegende Medienaufnahme erforderlichen Namespaces enthalten.

using Windows.Media.Core;

Initialisieren und Hinzufügen des Gesichterkennungseffekts zum Vorschaudatenstrom

Videoeffekte werden mit zwei APIs, einer Effektdefinition, die die für das Aufnahmegerät benötigten Einstellungen zum Initialisieren des Effekts bereitstellt, und einer Effektinstanz implementiert, die zum Steuern des Effekts verwendet werden kann. Da Sie ggf. von mehreren Stellen innerhalb des Codes aus auf die Effektinstanz zugreifen müssen, sollten Sie in der Regel eine Membervariable als Container für das Objekt deklarieren.

FaceDetectionEffect _faceDetectionEffect;

Erstellen Sie nach dem Initialisieren des MediaCapture-Objekts in Ihrer App eine neue Instanz von FaceDetectionEffectDefinition. Legen Sie die DetectionMode-Eigenschaft fest, um eine schnellere oder genauere Gesichtserkennung zu bevorzugen. Legen Sie die SynchronousDetectionEnabled-Eigenschaft fest, um anzugeben, dass eingehende Frames nicht durch eine andauernde Gesichtserkennung verzögert werden, da dies zu einer stockenden Vorschau führen kann.

Registrieren Sie den Effekt mit dem Aufnahmegerät durch Aufrufen der AddVideoEffectAsync-Methode für Ihr MediaCapture-Objekt, stellen Sie FaceDetectionEffectDefinition bereit, und geben Sie MediaStreamType.VideoPreview an, damit der Effekt im Gegensatz zum Aufnahmedatenstrom auf den Videovorschaudatenstrom angewendet wird. AddVideoEffectAsync gibt eine Instanz des hinzugefügten Effekts zurück. Da diese Methode mit verschiedenen Effekttypen verwendet werden kann, müssen Sie die zurückgegebene Instanz in ein FaceDetectionEffect-Objekt umwandeln.

Aktivieren bzw. deaktivieren Sie den Effekt, indem Sie die FaceDetectionEffect.Enabled-Eigenschaft festlegen. Geben Sie an, wie oft der Effekt Frames analysieren soll, indem Sie die FaceDetectionEffect.DesiredDetectionInterval-Eigenschaft festlegen. Beide Eigenschaften können angepasst werden, während der Medienaufnahme ausgeführt wird.


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

Empfangen von Benachrichtigungen, wenn Gesichter erkannt werden

Wenn Sie während der Gesichtserkennung Aktionen ausführen möchten, z. B. Zeichnen eines Rahmens um die erkannten Gesichter in der Videovorschau, können Sie eine Registrierung für das FaceDetected-Ereignis durchführen.

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

Im Handler für das Ereignis erhalten Sie eine Liste mit allen in einem Frame erkannten Gesichtern, indem Sie auf die FaceDetectionEffectFrame.DetectedFaces-Eigenschaft von FaceDetectedEventArgs zugreifen. Die FaceBox-Eigenschaft ist eine BitmapBounds-Struktur, die das Rechteck mit dem erkannten Gesicht relativ zu den Abmessungen des Vorschaudatenstroms beschreibt. Einen Beispielcode, der die Koordinaten des Vorschaudatenstroms in Bildschirmkoordinaten umwandelt, finden Sie unter Gesichtserkennungsbeispiel für UWP.

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

Bereinigen des Gesichtserkennungseffekts

Wenn Ihre App die Aufnahme abgeschlossen hat, deaktivieren Sie vor dem Löschen des MediaCapture-Objekts den Gesichtserkennungseffekt mit FaceDetectionEffect.Enabled, und heben Sie die Registrierung Ihres FaceDetected-Ereignishandlers auf, wenn Sie einen registriert haben. Rufen Sie MediaCapture.ClearEffectsAsync auf, und geben Sie den Videovorschaudatenstrom an, da der Effekt diesem Datenstrom hinzugefügt wurde. Legen Sie schließlich die Membervariable auf NULL fest.

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

Überprüfen der Fokus- und Belichtungsunterstützung für erkannte Gesichter

Nicht alle Geräte verfügen über ein Aufnahmegerät, das den Fokus und die Belichtung auf Grundlage der erkannten Gesichter anpassen kann. Da Gesichtserkennung Geräteressourcen in Anspruch nimmt, sollten Sie die Gesichtserkennung nur auf Geräten aktivieren, die das Feature zur Verbesserung der Aufnahme verwenden können. Rufen Sie zum Festzustellen, ob die gesichtsbasierte Aufnahmeoptimierung verfügbar ist, die VideoDeviceController-Klasse für Ihre initialisierte MediaCapture ab, und rufen Sie dann die RegionsOfInterestControl-Klasse des Videogerätecontrollers ab. Überprüfen Sie, ob die MaxRegions-Eigenschaft mindestens eine Region unterstützt. Überprüfen Sie dann, ob die AutoExposureSupported-Eigenschaft oder die AutoFocusSupported-Eigenschaft den Wert „true“ aufweist. Wenn diese Bedingungen erfüllt sind, kann das Gerät die Vorteile der Gesichtserkennung für eine verbesserte Aufnahme nutzen.

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