Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article vous montre comment utiliser la bibliothèque open source Vision par ordinateur (OpenCV), une bibliothèque de code native qui fournit un large éventail d’algorithmes de traitement d’images, avec la classe MediaFrameReader qui peut lire simultanément des images multimédias à partir de plusieurs sources. L’exemple de code de cet article vous guide tout au long de la création d’une application simple qui obtient des images à partir d’un capteur de couleur, flout chaque image à l’aide de la bibliothèque OpenCV, puis affiche l’image traitée dans un contrôle d’image XAML.
Remarque
OpenCV.Win.Core et OpenCV.Win.ImgProc ne sont pas régulièrement mis à jour et ne passent pas les contrôles de conformité du magasin, c’est pourquoi ces packages sont uniquement destinés à l’expérimentation.
Cet article s’appuie sur le contenu de deux autres articles :
Traiter des images multimédias avec MediaFrameReader : cet article fournit des informations détaillées sur l’utilisation de MediaFrameReader pour obtenir des images à partir d’une ou plusieurs sources de trames multimédias et décrit, en détail, l’exemple de code de cet article. En particulier, traiter les trames multimédias avec MediaFrameReader fournit la liste de code pour une classe d’assistance, FrameRenderer, qui gère la présentation des images multimédias dans un élément d’image XAML. L’exemple de code de cet article utilise également cette classe d’assistance.
Traiter des bitmaps logicielles avec OpenCV - Cet article vous guide tout au long de la création d’un composant Windows Runtime de code natif, OpenCVBridge, qui permet de convertir entre l’objet SoftwareBitmap , utilisé par MediaFrameReader et le type Mat utilisé par la bibliothèque OpenCV. L’exemple de code de cet article suppose que vous avez suivi les étapes permettant d’ajouter le composant OpenCVBridge à votre solution d’application UWP.
En plus de ces articles, pour afficher et télécharger un exemple complet de travail de bout en bout du scénario décrit dans cet article, consultez l’exemple Camera Frames + OpenCV dans le référentiel GitHub d’exemples universels Windows.
Pour commencer à développer rapidement, vous pouvez inclure la bibliothèque OpenCV dans un projet d’application UWP à l’aide de packages NuGet, mais ces packages peuvent ne pas passer le processus de certification de l’application lorsque vous soumettez votre application au Store. Il est donc recommandé de télécharger le code source de la bibliothèque OpenCV et de générer les fichiers binaires vous-même avant de soumettre votre application. Vous trouverez des informations sur le développement avec OpenCV à l’adresse https://opencv.org
Implémenter le composant Windows Runtime natif OpenCVHelper
Suivez les étapes de traitement des bitmaps logicielles avec OpenCV pour créer le composant Windows Runtime de l’assistance OpenCV et ajouter une référence au projet de composant à votre solution d’application UWP.
Rechercher des groupes sources d’images disponibles
Tout d’abord, vous devez trouver un groupe source d’images multimédias à partir duquel les images multimédias seront obtenues. Obtenez la liste des groupes sources disponibles sur l’appareil actuel en appelant MediaFrameSourceGroup.FindAllAsync. Sélectionnez ensuite les groupes sources qui fournissent les types de capteurs requis pour votre scénario d’application. Pour cet exemple, nous avons simplement besoin d’un groupe source qui fournit des images à partir d’une caméra RVB.
var frameSourceGroups = await MediaFrameSourceGroup.FindAllAsync();
var selectedGroupObjects = frameSourceGroups.Select(group =>
new
{
sourceGroup = group,
colorSourceInfo = group.SourceInfos.FirstOrDefault((sourceInfo) =>
{
// On Xbox/Kinect, omit the MediaStreamType and EnclosureLocation tests
return sourceInfo.SourceKind == MediaFrameSourceKind.Color;
})
}).Where(t => t.colorSourceInfo != null)
.FirstOrDefault();
MediaFrameSourceGroup selectedGroup = selectedGroupObjects?.sourceGroup;
MediaFrameSourceInfo colorSourceInfo = selectedGroupObjects?.colorSourceInfo;
if (selectedGroup == null)
{
return;
}
Initialiser l’objet MediaCapture
Ensuite, vous devez initialiser l’objet MediaCapture pour utiliser le groupe source frame sélectionné à l’étape précédente en définissant la propriété SourceGroup de MediaCaptureInitializationSettings.
Remarque
La technique utilisée par le composant OpenCVHelper, décrite en détail dans les bitmaps logicielles Process avec OpenCV, nécessite que les données d’image résident dans la mémoire processeur, et non dans la mémoire GPU. Par conséquent, vous devez spécifier MemoryPreference.CPU pour le champ MemoryPreference de MediaCaptureInitializationSettings.
Une fois l’objet MediaCapture initialisé, obtenez une référence à la source de trame RVB en accédant à la propriété MediaCapture.FrameSources.
mediaCapture = new MediaCapture();
var settings = new MediaCaptureInitializationSettings()
{
SourceGroup = selectedGroup,
SharingMode = MediaCaptureSharingMode.ExclusiveControl,
MemoryPreference = MediaCaptureMemoryPreference.Cpu,
StreamingCaptureMode = StreamingCaptureMode.Video
};
try
{
await mediaCapture.InitializeAsync(settings);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("MediaCapture initialization failed: " + ex.Message);
return;
}
var colorFrameSource = mediaCapture.FrameSources[colorSourceInfo.Id];
Initialiser MediaFrameReader
Ensuite, créez un MediaFrameReader pour la source de trame RVB récupérée à l’étape précédente. Pour maintenir une bonne fréquence d’images, vous pouvez traiter des images ayant une résolution inférieure à la résolution du capteur. Cet exemple fournit l’argument BitmapSize facultatif à la méthode MediaCapture.CreateFrameReaderAsync pour demander que les images fournies par le lecteur d’images soient redimensionnées à 640 x 480 pixels.
Après avoir créé le lecteur d’images, inscrivez un gestionnaire pour l’événement FrameArrived . Créez ensuite un objet SoftwareBitmapSource , que la classe d’assistance FrameRenderer utilisera pour présenter l’image traitée. Appelez ensuite le constructeur pour FrameRenderer. Initialisez l’instance de la classe OpenCVHelper définie dans le composant Windows Runtime OpenCVBridge. Cette classe d’assistance est utilisée dans le gestionnaire FrameArrived pour traiter chaque image. Enfin, démarrez le lecteur d’images en appelant StartAsync.
BitmapSize size = new BitmapSize() // Choose a lower resolution to make the image processing more performant
{
Height = 480,
Width = 640
};
mediaFrameReader = await mediaCapture.CreateFrameReaderAsync(colorFrameSource, MediaEncodingSubtypes.Argb32, size);
mediaFrameReader.FrameArrived += ColorFrameReader_FrameArrived_OpenCV;
imageElement.Source = new SoftwareBitmapSource();
_frameRenderer = new FrameRenderer(imageElement);
await mediaFrameReader.StartAsync();
Gérer l’événement FrameArrived
L’événement FrameArrived est déclenché chaque fois qu’une nouvelle image est disponible à partir du lecteur d’images. Appelez TryAcquireLatestFrame pour obtenir le frame, s’il existe. Obtenez le SoftwareBitmap à partir de MediaFrameReference. Notez que la classe CVHelper utilisée dans cet exemple nécessite que les images utilisent le format de pixel BRGA8 avec alpha prémultiplié. Si le frame passé dans l’événement a un format différent, convertissez le SoftwareBitmap au format correct. Ensuite, créez un SoftwareBitmap à utiliser comme cible de l’opération de flou. Les propriétés d’image source sont utilisées comme arguments pour le constructeur pour créer une bitmap au format correspondant. Appelez la méthode Blur de la classe d’assistance pour traiter le frame. Enfin, transmettez l’image de sortie de l’opération de flou dans PresentSoftwareBitmap, la méthode de la classe d’assistance FrameRenderer qui affiche l’image dans le contrôle Image XAML avec laquelle elle a été initialisée.
private void ColorFrameReader_FrameArrived_OpenCV(MediaFrameReader sender, MediaFrameArrivedEventArgs args)
{
var mediaFrameReference = sender.TryAcquireLatestFrame();
if (mediaFrameReference != null)
{
SoftwareBitmap openCVInputBitmap = null;
var inputBitmap = mediaFrameReference.VideoMediaFrame?.SoftwareBitmap;
if (inputBitmap != null)
{
//The XAML Image control can only display images in BRGA8 format with premultiplied or no alpha
if (inputBitmap.BitmapPixelFormat == BitmapPixelFormat.Bgra8
&& inputBitmap.BitmapAlphaMode == BitmapAlphaMode.Premultiplied)
{
openCVInputBitmap = SoftwareBitmap.Copy(inputBitmap);
}
else
{
openCVInputBitmap = SoftwareBitmap.Convert(inputBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
}
SoftwareBitmap openCVOutputBitmap = new SoftwareBitmap(BitmapPixelFormat.Bgra8, openCVInputBitmap.PixelWidth, openCVInputBitmap.PixelHeight, BitmapAlphaMode.Premultiplied);
// operate on the image and render it
openCVHelper.Blur(openCVInputBitmap, openCVOutputBitmap);
_frameRenderer.PresentSoftwareBitmap(openCVOutputBitmap);
}
}
}
Rubriques connexes
- Appareil photo
- Capture photo, vidéo et audio de base à l’aide de MediaCapture
- Traiter des trames multimédias avec MediaFrameReader
- Traiter des bitmaps logicielles avec OpenCV
- Exemple d’images de caméra
- Image photo + exemple OpenCV