Effekte für die Analyse von Kameraframes

In diesem Artikel wird beschrieben, wie Sie den Inhalt des Vorschaudatenstroms der Medienaufnahme mithilfe von SceneAnalysisEffect und FaceDetectionEffect analysieren.

Szenenanalyseeffekt

Die SceneAnalysisEffect analysiert die Videoframes im Vorschaudatenstrom der Medienaufnahme und empfiehlt Verarbeitungsoptionen, um das Aufnahmeergebnis zu verbessern. Derzeit unterstützt der Effekt die Erkennung, ob die Aufnahme mithilfe der HDR-Verarbeitung (High Dynamic Range) verbessert werden würde.

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

Szenenanalysenamespaces

Zur Verwendung der Szenenanalyse muss Ihre App zusätzlich zu den namespaces, die für die grundlegende Medienaufnahme erforderlich sind, die folgenden Namespaces enthalten.

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

Initialisieren des Szenenanalyseeffekts und Hinzufügen des Szenenanalyseeffekts zum Vorschaudatenstrom

Videoeffekte werden mit zwei APIs implementiert, einer Effektdefinition, die Einstellungen bereitstellt, die das Aufnahmegerät zum Initialisieren des Effekts benötigt, und eine Effektinstanz, die zum Steuern des Effekts verwendet werden kann. Da Sie möglicherweise von mehreren Stellen im Code auf die Effektinstanz zugreifen möchten, sollten Sie in der Regel eine Membervariable deklarieren, um das Objekt zu speichern.

private SceneAnalysisEffect _sceneAnalysisEffect;

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

Registrieren Sie den Effekt mit dem Aufnahmegerät, indem Sie AddVideoEffectAsync für Ihr MediaCapture-Objekt aufrufen, indem Sie "SceneAnalysisEffectDefinition" bereitstellen und "MediaStreamType.VideoPreview" angeben, um anzugeben, dass der Effekt auf den Videovorschaudatenstrom angewendet werden soll, im Gegensatz zum Aufnahmedatenstrom. AddVideoEffectAsync gibt eine Instanz des hinzugefügten Effekts zurück. Da diese Methode mit mehreren 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 enthält der Szenenanalyseeffekt nur den Analyseanalysator für hohen dynamischen Bereich. Aktivieren Sie die HDR-Analyse, indem Sie " HighDynamicRangeControl.Enabled " 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 weist ein SceneAnalysisEffectFrame-Objekt auf, das ein HighDynamicRangeOutput-Objekt aufweist. Die Certainty-Eigenschaft der Ausgabe mit hohem Dynamischen Bereich bietet einen Wert zwischen 0 und 1,0, wobei 0 angibt, dass die HDR-Verarbeitung nicht dazu beitragen würde, das Aufnahmeergebnis zu verbessern, und 1,0 weist darauf hin, dass die HDR-Verarbeitung hilfreich wäre. Sie können den Schwellenwert festlegen, an dem Sie HDR verwenden möchten, oder die Ergebnisse für den Benutzer anzeigen und den Benutzer 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 vorgeschlagene Framecontroller zum Aufnehmen einer variablen Fotosequenz für die HDR-Verarbeitung enthält. Weitere Informationen finden Sie unter Variable Fotosequenz.

Bereinigen des Szenenanalyseeffekts

Wenn die App die Erfassung abgeschlossen hat, sollten Sie vor dem Entfernen des MediaCapture-Objekts den Szenenanalyseeffekt deaktivieren, indem Sie die HighDynamicRangeAnalyzer.Enabled-Eigenschaft auf "false" festlegen und die Registrierung des SceneAnalyzed-Ereignishandlers aufheben. Rufen Sie "MediaCapture.ClearEffectsAsync" auf, und geben Sie den Videovorschaudatenstrom an, da dieser der Stream war, zu dem der Effekt 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 im Vorschaudatenstrom der Medienaufnahme. Der Effekt ermöglicht es Ihnen, eine Benachrichtigung zu erhalten, wenn im Vorschaudatenstrom eine Benachrichtigung erkannt wird und das Begrenzungsfeld für jedes erkannte Gesicht innerhalb des Vorschauframes bereitstellt. Auf unterstützten Geräten bietet der Gesichtserkennungseffekt auch eine verbesserte Belichtung und den Fokus auf das wichtigste Gesicht in der Szene.

Namespaces für die Gesichtserkennung

Um die Gesichtserkennung zu verwenden, muss Ihre App zusätzlich zu den Namespaces, die für die grundlegende Medienaufnahme erforderlich sind, die folgenden Namespaces enthalten.

using Windows.Media.Core;

Initialisieren des Gesichtserkennungseffekts und Hinzufügen des Gesichtserkennungseffekts zum Vorschaudatenstrom

Videoeffekte werden mit zwei APIs implementiert, einer Effektdefinition, die Einstellungen bereitstellt, die das Aufnahmegerät zum Initialisieren des Effekts benötigt, und eine Effektinstanz, die zum Steuern des Effekts verwendet werden kann. Da Sie möglicherweise von mehreren Stellen im Code auf die Effektinstanz zugreifen möchten, sollten Sie in der Regel eine Membervariable deklarieren, um das Objekt zu speichern.

FaceDetectionEffect _faceDetectionEffect;

Erstellen Sie in Ihrer App nach dem Initialisieren des MediaCapture-Objekts eine neue Instanz von FaceDetectionEffectDefinition. Legen Sie die DetectionMode-Eigenschaft fest, um eine schnellere Gesichtserkennung oder genauere Gesichtserkennung zu priorisieren. Legen Sie SynchronDetectionEnabled fest, um anzugeben, dass eingehende Frames nicht verzögert werden, bis die Gesichtserkennung abgeschlossen ist, da dies zu einer abgehackten Vorschauumgebung führen kann.

Registrieren Sie den Effekt mit dem Aufnahmegerät, indem Sie AddVideoEffectAsync für Ihr MediaCapture-Objekt aufrufen, indem Sie faceDetectionEffectDefinition bereitstellen und MediaStreamType.VideoPreview angeben, um anzugeben, dass der Effekt auf den Videovorschaustream angewendet werden soll, im Gegensatz zum Aufnahmedatenstrom. AddVideoEffectAsync gibt eine Instanz des hinzugefügten Effekts zurück. Da diese Methode mit mehreren Effekttypen verwendet werden kann, müssen Sie die zurückgegebene Instanz in ein FaceDetectionEffect-Objekt umwandeln.

Aktivieren oder deaktivieren Sie den Effekt, indem Sie die FaceDetectionEffect.Enabled-Eigenschaft festlegen. Passen Sie an, wie oft der Effekt Frames analysiert, indem Sie die FaceDetectionEffect.DesiredDetectionInterval-Eigenschaft festlegen. Beide Eigenschaften können angepasst werden, während die Medienaufnahme fortgesetzt 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 aktionen ausführen möchten, wenn Gesichter erkannt werden, z. B. das Zeichnen eines Felds um erkannte Gesichter in der Videovorschau, können Sie sich für das FaceDetected-Ereignis registrieren.

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

Im Handler für das Ereignis können Sie eine Liste aller Gesichter abrufen, die in einem Frame erkannt wurden, indem Sie auf die FaceDetectionEffectFrame.DetectedFaces-Eigenschaft der FaceDetectedEventArgs zugreifen. Die FaceBox-Eigenschaft ist eine BitmapBounds-Struktur, die das Rechteck beschreibt, das das erkannte Gesicht in Einheiten relativ zu den Abmessungen des Vorschaudatenstroms enthält. Informationen zum Anzeigen von Beispielcode, der die Vorschaudatenstromkoordinaten in Bildschirmkoordinaten transformiert, finden Sie im UWP-Beispiel zur Gesichtserkennung.

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 die App mit der Erfassung fertig ist, sollten Sie vor dem Löschen des MediaCapture-Objekts den Gesichtserkennungseffekt mit FaceDetectionEffect.Enabled deaktivieren und die Registrierung des FaceDetected-Ereignishandlers aufheben, wenn Sie zuvor einen registriert haben. Rufen Sie "MediaCapture.ClearEffectsAsync" auf, und geben Sie den Videovorschaudatenstrom an, da dieser der Stream war, zu dem der Effekt 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 basierend auf erkannten Gesichtern anpassen kann. Da die Gesichtserkennung Geräteressourcen verbraucht, sollten Sie die Gesichtserkennung nur auf Geräten aktivieren, die das Feature verwenden können, um die Erfassung zu verbessern. Um festzustellen, ob die Optimierung der gesichtsbasierten Aufnahme verfügbar ist, rufen Sie den VideoDeviceController für Ihre initialisierte MediaCapture ab, und rufen Sie dann die RegionsOfInterestControl des Videogerätecontrollers ab. Überprüfen Sie, ob die MaxRegions mindestens eine Region unterstützt. Überprüfen Sie dann, ob AutoExposureSupported oder AutoFocusSupported "true" ist. Wenn diese Bedingungen erfüllt sind, kann das Gerät die Gesichtserkennung nutzen, um die Erfassung zu verbessern.

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