Puoi utilizzare Firebase ML per riconoscere punti di riferimento ben noti in un'immagine.
Prima di iniziare
-
Se non hai ancora aggiunto Firebase alla tua app, segui i passaggi descritti nella guida introduttiva.
- In Xcode, con il progetto dell'app aperto, vai a File > Aggiungi pacchetti.
- Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple di Firebase:
- Scegli la raccolta Firebase ML.
- Aggiungi il flag
-ObjC
alla sezione Altri flag del linker delle impostazioni di compilazione del target. - Al termine, Xcode inizierà automaticamente a risolvere e a scaricare le tue dipendenze in background.
- Nell'app, importa Firebase:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
Se non hai ancora attivato le API basate su cloud per il tuo progetto, fallo subito:
- Apri la Firebase ML pagina API della console Firebase.
-
Se non hai ancora eseguito l'upgrade del progetto al piano tariffario Blaze, fai clic su Esegui l'upgrade per farlo. Ti verrà chiesto di eseguire l'upgrade solo se il progetto non è nel piano Blaze.
Solo i progetti a livello Blaze possono utilizzare le API basate su Cloud.
- Se le API basate su cloud non sono già abilitate, fai clic su Abilita API basate su cloud.
Utilizza Swift Package Manager per installare e gestire le dipendenze di Firebase.
https://github.com/firebase/firebase-ios-sdk.git
Poi, esegui alcune configurazioni in-app:
Configurare il rilevatore di punti di riferimento
Per impostazione predefinita, il rilevatore Cloud utilizza la versione stabile del modello e
restituisce fino a 10 risultati. Se vuoi modificare una di queste impostazioni,
specificale con un oggetto VisionCloudDetectorOptions
come показано в следующем примере:
Swift
let options = VisionCloudDetectorOptions() options.modelType = .latest options.maxResults = 20
Objective-C
FIRVisionCloudDetectorOptions *options = [[FIRVisionCloudDetectorOptions alloc] init]; options.modelType = FIRVisionCloudModelTypeLatest; options.maxResults = 20;
Nel passaggio successivo, passa l'oggetto VisionCloudDetectorOptions
quando crei l'oggetto Cloud Detector.
Esegui il rilevamento dei punti di riferimento
Per riconoscere i punti di riferimento in un'immagine, passa l'immagine comeUIImage
o
CMSampleBufferRef
al metodo detect(in:)
di VisionCloudLandmarkDetector
:
- Recupera un'istanza di
VisionCloudLandmarkDetector
:Swift
lazy var vision = Vision.vision() let cloudDetector = vision.cloudLandmarkDetector(options: options) // Or, to use the default settings: // let cloudDetector = vision.cloudLandmarkDetector()
Objective-C
FIRVision *vision = [FIRVision vision]; FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector]; // Or, to change the default settings: // FIRVisionCloudLandmarkDetector *landmarkDetector = // [vision cloudLandmarkDetectorWithOptions:options];
-
Per chiamare Cloud Vision, l'immagine deve essere formattata come stringa codificata in base64. Per elaborare un
UIImage
:Swift
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
-
Quindi, passa l'immagine al metodo
detect(in:)
:Swift
cloudDetector.detect(in: visionImage) { landmarks, error in guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else { // ... return } // Recognized landmarks // ... }
Objective-C
[landmarkDetector detectInImage:image completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks, NSError *error) { if (error != nil) { return; } else if (landmarks != nil) { // Got landmarks } }];
Ricevere informazioni sui punti di riferimento riconosciuti
Se il riconoscimento dei punti di riferimento va a buon fine, un array di oggettiVisionCloudLandmark
viene passato al gestore del completamento. Da ogni oggetto puoi ottenere informazioni su un punto di riferimento riconosciuto nell'immagine.
Ad esempio:
Swift
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 }
Objective-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]; }
Passaggi successivi
- Prima di eseguire il deployment in produzione di un'app che utilizza un'API Cloud, devi eseguire alcuni passaggi aggiuntivi per prevenire e attenuare l'effetto dell'accesso non autorizzato all'API.