Vous pouvez utiliser ML Kit pour reconnaître des points de repère bien connus dans une image.
Avant que tu commences
- Si vous n'avez pas encore ajouté Firebase à votre application, faites-le en suivant les étapes du guide de démarrage .
- Incluez les bibliothèques ML Kit dans votre Podfile :
pod 'Firebase/MLVision', '6.25.0'
Après avoir installé ou mis à jour les pods de votre projet, assurez-vous d'ouvrir votre projet Xcode à l'aide de son.xcworkspace
. - Dans votre application, importez Firebase :
Rapide
import Firebase
Objectif c
@import Firebase;
Si vous n'avez pas encore activé les API basées sur le cloud pour votre projet, faites-le maintenant :
- Ouvrez la page API du kit ML de la console Firebase.
Si vous n'avez pas encore mis à niveau votre projet vers un plan tarifaire Blaze, cliquez sur Mettre à niveau pour le faire. (Vous serez invité à mettre à niveau uniquement si votre projet n'est pas sur le plan Blaze.)
Seuls les projets de niveau Blaze peuvent utiliser des API basées sur le cloud.
- Si les API basées sur le cloud ne sont pas déjà activées, cliquez sur Activer les API basées sur le cloud .
Configurer le détecteur de point de repère
Par défaut, le détecteur Cloud utilise la version stable du modèle et renvoie jusqu'à 10 résultats. Si vous souhaitez modifier l'un de ces paramètres, spécifiez-le avec un objet VisionCloudDetectorOptions
comme dans l'exemple suivant :
Rapide
let options = VisionCloudDetectorOptions() options.modelType = .latest options.maxResults = 20
Objectif c
FIRVisionCloudDetectorOptions *options = [[FIRVisionCloudDetectorOptions alloc] init]; options.modelType = FIRVisionCloudModelTypeLatest; options.maxResults = 20;
À l'étape suivante, transmettez l'objet VisionCloudDetectorOptions
lorsque vous créez l'objet Détecteur de nuage.
Exécutez le détecteur de point de repère
Pour reconnaître des points de repère dans une image, transmettez l'image en tant queUIImage
ou CMSampleBufferRef
à la VisionCloudLandmarkDetector
detect(in:)
de VisionCloudLandmarkDetector :- Obtenez une instance de
VisionCloudLandmarkDetector
:Rapide
lazy var vision = Vision.vision() let cloudDetector = vision.cloudLandmarkDetector(options: options) // Or, to use the default settings: // let cloudDetector = vision.cloudLandmarkDetector()
Objectif c
FIRVision *vision = [FIRVision vision]; FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector]; // Or, to change the default settings: // FIRVisionCloudLandmarkDetector *landmarkDetector = // [vision cloudLandmarkDetectorWithOptions:options];
Créez un objet
VisionImage
à l'aide d'unUIImage
ou d'unCMSampleBufferRef
.Pour utiliser une
UIImage
:- Si nécessaire, faites pivoter l'image afin que sa propriété
imageOrientation
soit.up
. - Créez un objet
VisionImage
à l'aide de l'objetUIImage
correctement pivoté. Ne spécifiez aucune métadonnée de rotation—la valeur par défaut,.topLeft
, doit être utilisée.Rapide
let image = VisionImage(image: uiImage)
Objectif c
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
Pour utiliser un
CMSampleBufferRef
:Créez un objet
VisionImageMetadata
qui spécifie l'orientation des données d'image contenues dans le tamponCMSampleBufferRef
.Pour obtenir l'orientation de l'image :
Rapide
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
Objectif c
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
Créez ensuite l'objet de métadonnées :
Rapide
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objectif c
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
- Créez un objet
VisionImage
à l'aide de l'objetCMSampleBufferRef
et des métadonnées de rotation :Rapide
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objectif c
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- Si nécessaire, faites pivoter l'image afin que sa propriété
- Ensuite, passez l'image à la méthode
detect(in:)
:Rapide
cloudDetector.detect(in: visionImage) { landmarks, error in guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else { // ... return } // Recognized landmarks // ... }
Objectif c
[landmarkDetector detectInImage:image completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks, NSError *error) { if (error != nil) { return; } else if (landmarks != nil) { // Got landmarks } }];
Obtenir des informations sur les monuments reconnus
Si la reconnaissance de point de repère réussit, un tableau d'objetsVisionCloudLandmark
sera transmis au gestionnaire d'achèvement. A partir de chaque objet, vous pouvez obtenir des informations sur un point de repère reconnu dans l'image.Par exemple:
Rapide
for landmark in landmarks { let landmarkDesc = landmark.landmark let boundingPoly = landmark.frame let entityId = landmark.entityId // A landmark can have multiple locations: for example, the location the image // was taken, and the location of the landmark depicted. for location in landmark.locations { let latitude = location.latitude let longitude = location.longitude } let confidence = landmark.confidence }
Objectif c
for (FIRVisionCloudLandmark *landmark in landmarks) { NSString *landmarkDesc = landmark.landmark; CGRect frame = landmark.frame; NSString *entityId = landmark.entityId; // A landmark can have multiple locations: for example, the location the image // was taken, and the location of the landmark depicted. for (FIRVisionLatitudeLongitude *location in landmark.locations) { double latitude = [location.latitude doubleValue]; double longitude = [location.longitude doubleValue]; } float confidence = [landmark.confidence floatValue]; }
Prochaines étapes
- Avant de déployer en production une application qui utilise une API Cloud, vous devez prendre des mesures supplémentaires pour empêcher et atténuer les effets d'un accès non autorisé à l'API .