Partager via


Effets de l’analyse des images de caméra

Cet article explique comment utiliser SceneAnalysisEffect et FaceDetectionEffect pour analyser le contenu du flux d’aperçu de capture multimédia.

Effet d’analyse de scène

SceneAnalysisEffect analyse les images vidéo dans le flux d’aperçu de capture multimédia et recommande de traiter les options de traitement pour améliorer le résultat de la capture. Actuellement, l’effet prend en charge la détection de l’amélioration de la capture à l’aide du traitement HDR (High Dynamic Range).

Si l’effet recommande d’utiliser HDR, vous pouvez le faire de la manière suivante :

Espaces de noms d’analyse de scène

Pour utiliser l’analyse des scènes, votre application doit inclure les espaces de noms suivants en plus des espaces de noms requis pour la capture multimédia de base.

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

Initialiser l’effet d’analyse de scène et l’ajouter au flux d’aperçu

Les effets vidéo sont implémentés à l’aide de deux API, une définition d’effet, qui fournit des paramètres que l’appareil de capture doit initialiser l’effet et une instance d’effet, qui peut être utilisée pour contrôler l’effet. Étant donné que vous souhaiterez peut-être accéder à l’instance d’effet à partir de plusieurs emplacements dans votre code, vous devez généralement déclarer une variable membre pour contenir l’objet.

private SceneAnalysisEffect _sceneAnalysisEffect;

Dans votre application, après avoir initialisé l’objet MediaCapture, créez une instance de SceneAnalysisEffectDefinition.

Inscrivez l’effet auprès de l’appareil de capture en appelant AddVideoEffectAsync sur votre objet MediaCapture, en fournissant SceneAnalysisEffectDefinition et en spécifiant MediaStreamType.VideoPreview pour indiquer que l’effet doit être appliqué au flux d’aperçu vidéo, par opposition au flux de capture. AddVideoEffectAsync retourne une instance de l’effet ajouté. Étant donné que cette méthode peut être utilisée avec plusieurs types d’effets, vous devez convertir l’instance retournée en objet SceneAnalysisEffect.

Pour recevoir les résultats de l’analyse de scène, vous devez inscrire un gestionnaire pour l’événement SceneAnalyzed .

Actuellement, l’effet d’analyse de scène inclut uniquement l’analyseur de plage dynamique élevé. Activez l’analyse HDR en définissant l’effet HighDynamicRangeControl.Enabled sur 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;

Implémenter le gestionnaire d’événements SceneAnalyzed

Les résultats de l’analyse de scène sont retournés dans le gestionnaire d’événements SceneAnalyzed . L’objet SceneAnalyzedEventArgs passé dans le gestionnaire a un objet SceneAnalysisEffectFrame qui a un objet HighDynamicRangeOutput. La propriété Certitude de la sortie de plage dynamique élevée fournit une valeur comprise entre 0 et 1,0, où 0 indique que le traitement HDR n’aiderait pas à améliorer le résultat de capture et 1,0 indique que le traitement HDR serait utile. Vous pouvez décider du point de seuil auquel vous souhaitez utiliser HDR ou afficher les résultats à l’utilisateur et laisser l’utilisateur décider.

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’objet HighDynamicRangeOutput passé dans le gestionnaire a également une propriété FrameControllers qui contient des contrôleurs d’images suggérés pour capturer une séquence de photos variable pour le traitement HDR. Pour plus d’informations, consultez Séquence de photos variable.

Nettoyer l’effet d’analyse de scène

Une fois votre application capturée, avant de supprimer l’objet MediaCapture, vous devez désactiver l’effet d’analyse de scène en définissant la propriété HighDynamicRangeAnalyzer.Enabled de l’effet sur false et annuler l’inscription de votre gestionnaire d’événements SceneAnalyzed. Appelez MediaCapture.ClearEffectsAsync, en spécifiant le flux d’aperçu vidéo depuis qu’il s’agissait du flux auquel l’effet a été ajouté. Enfin, définissez votre variable membre sur 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;

Effet de détection des visages

FaceDetectionEffect identifie l’emplacement des visages dans le flux d’aperçu de capture multimédia. L’effet vous permet de recevoir une notification chaque fois qu’un visage est détecté dans le flux d’aperçu et fournit la zone englobante pour chaque visage détecté dans le cadre d’aperçu. Sur les appareils pris en charge, l’effet de détection des visages offre également une exposition améliorée et se concentre sur le visage le plus important de la scène.

Espaces de noms de détection des visages

Pour utiliser la détection des visages, votre application doit inclure les espaces de noms suivants en plus des espaces de noms requis pour la capture multimédia de base.

using Windows.Media.Core;

Initialiser l’effet de détection de visage et l’ajouter au flux d’aperçu

Les effets vidéo sont implémentés à l’aide de deux API, une définition d’effet, qui fournit des paramètres que l’appareil de capture doit initialiser l’effet et une instance d’effet, qui peut être utilisée pour contrôler l’effet. Étant donné que vous souhaiterez peut-être accéder à l’instance d’effet à partir de plusieurs emplacements dans votre code, vous devez généralement déclarer une variable membre pour contenir l’objet.

FaceDetectionEffect _faceDetectionEffect;

Dans votre application, après avoir initialisé l’objet MediaCapture, créez une instance de FaceDetectionEffectDefinition. Définissez la propriété DetectionMode pour hiérarchiser la détection des visages plus rapide ou plus précise. Définissez SynchronousDetectionEnabled pour spécifier que les images entrantes ne sont pas retardées en attendant la fin de la détection des visages, car cela peut entraîner une expérience d’aperçu hachée.

Inscrivez l’effet auprès de l’appareil de capture en appelant AddVideoEffectAsync sur votre objet MediaCapture, en fournissant FaceDetectionEffectDefinition et en spécifiant MediaStreamType.VideoPreview pour indiquer que l’effet doit être appliqué au flux d’aperçu vidéo, par opposition au flux de capture. AddVideoEffectAsync retourne une instance de l’effet ajouté. Étant donné que cette méthode peut être utilisée avec plusieurs types d’effets, vous devez convertir l’instance retournée en objet FaceDetectionEffect.

Activez ou désactivez l’effet en définissant la propriété FaceDetectionEffect.Enabled. Ajustez la fréquence à laquelle l’effet analyse les images en définissant la propriété FaceDetectionEffect.DesiredDetectionInterval. Ces deux propriétés peuvent être ajustées pendant que la capture multimédia est en cours.


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

Recevoir des notifications lorsque des visages sont détectés

Si vous souhaitez effectuer une action lorsque des visages sont détectés, par exemple en dessinant une zone autour des visages détectés dans l’aperçu vidéo, vous pouvez vous inscrire à l’événement FaceDetected .

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

Dans le gestionnaire de l’événement, vous pouvez obtenir la liste de tous les visages détectés dans un frame en accédant à la propriété FaceDetectionEffectFrame.DetectedFaces de FaceDetectedEventArgs. La propriété FaceBox est une structure BitmapBounds qui décrit le rectangle contenant le visage détecté en unités par rapport aux dimensions du flux d’aperçu. Pour afficher l’exemple de code qui transforme les coordonnées du flux d’aperçu en coordonnées d’écran, consultez l’exemple UWP de détection de visage.

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

Nettoyer l’effet de détection des visages

Lorsque votre application a terminé la capture, avant de supprimer l’objet MediaCapture, vous devez désactiver l’effet de détection des visages avec FaceDetectionEffect.Enabled et annuler l’inscription de votre gestionnaire d’événements FaceDetected si vous en avez déjà inscrit un. Appelez MediaCapture.ClearEffectsAsync, en spécifiant le flux d’aperçu vidéo depuis qu’il s’agissait du flux auquel l’effet a été ajouté. Enfin, définissez votre variable membre sur 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;

Rechercher la prise en charge du focus et de l’exposition pour les visages détectés

Tous les appareils ne disposent pas d’un appareil de capture qui peut ajuster son focus et son exposition en fonction des visages détectés. Étant donné que la détection des visages consomme des ressources d’appareil, vous pouvez uniquement activer la détection des visages sur les appareils qui peuvent utiliser la fonctionnalité pour améliorer la capture. Pour voir si l’optimisation de capture basée sur les visages est disponible, obtenez VideoDeviceController pour votre MediaCapture initialisé, puis obtenez les RégionsOfInterestControl du contrôleur d’appareil vidéo. Vérifiez si MaxRegions prend en charge au moins une région. Vérifiez ensuite si AutoExposureSupported ou AutoFocusSupported sont vrais. Si ces conditions sont remplies, l’appareil peut tirer parti de la détection des visages pour améliorer la capture.

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