Puedes usar Firebase ML para reconocer puntos de referencia conocidos en una imagen.
Antes de que empieces
- Si aún no has agregado Firebase a tu aplicación, hazlo siguiendo los pasos de la guía de introducción .
- En Xcode, con el proyecto de su aplicación abierto, navegue hasta Archivo > Agregar paquetes .
- Cuando se le solicite, agregue el repositorio SDK de las plataformas Firebase Apple:
- Elija la biblioteca Firebase ML.
- Agregue el indicador
-ObjC
a la sección Otros indicadores del vinculador de la configuración de compilación de su objetivo. - Cuando termine, Xcode comenzará automáticamente a resolver y descargar sus dependencias en segundo plano.
- En tu aplicación, importa Firebase:
Rápido
import FirebaseMLModelDownloader
C objetivo
@import FirebaseMLModelDownloader;
Si aún no ha habilitado las API basadas en la nube para su proyecto, hágalo ahora:
- Abra la página API de Firebase ML de Firebase console.
Si aún no ha actualizado su proyecto al plan de precios Blaze, haga clic en Actualizar para hacerlo. (Se le pedirá que actualice solo si su proyecto no está en el plan Blaze).
Solo los proyectos de nivel Blaze pueden utilizar API basadas en la nube.
- Si las API basadas en la nube aún no están habilitadas, haga clic en Habilitar API basadas en la nube .
Utilice Swift Package Manager para instalar y administrar las dependencias de Firebase.
https://github.com/firebase/firebase-ios-sdk.git
A continuación, realice algunas configuraciones en la aplicación:
Configurar el detector de puntos de referencia
De forma predeterminada, el detector de nubes utiliza la versión estable del modelo y devuelve hasta 10 resultados. Si desea cambiar cualquiera de estas configuraciones, especifíquelas con un objeto VisionCloudDetectorOptions
como en el siguiente ejemplo:
Rápido
let options = VisionCloudDetectorOptions() options.modelType = .latest options.maxResults = 20
C objetivo
FIRVisionCloudDetectorOptions *options = [[FIRVisionCloudDetectorOptions alloc] init]; options.modelType = FIRVisionCloudModelTypeLatest; options.maxResults = 20;
En el siguiente paso, pase el objeto VisionCloudDetectorOptions
cuando cree el objeto detector de nubes.
Ejecute el detector de puntos de referencia
Para reconocer puntos de referencia en una imagen, pase la imagen comoUIImage
o CMSampleBufferRef
al método detect(in:)
de VisionCloudLandmarkDetector
:- Obtenga una instancia de
VisionCloudLandmarkDetector
:Rápido
lazy var vision = Vision.vision() let cloudDetector = vision.cloudLandmarkDetector(options: options) // Or, to use the default settings: // let cloudDetector = vision.cloudLandmarkDetector()
C objetivo
FIRVision *vision = [FIRVision vision]; FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector]; // Or, to change the default settings: // FIRVisionCloudLandmarkDetector *landmarkDetector = // [vision cloudLandmarkDetectorWithOptions:options];
- Para llamar a Cloud Vision, la imagen debe tener el formato de una cadena codificada en base64. Para procesar una
UIImage
:Rápido
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
C objetivo
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Luego, pasa la imagen al método
detect(in:)
:Rápido
cloudDetector.detect(in: visionImage) { landmarks, error in guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else { // ... return } // Recognized landmarks // ... }
C objetivo
[landmarkDetector detectInImage:image completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks, NSError *error) { if (error != nil) { return; } else if (landmarks != nil) { // Got landmarks } }];
Obtenga información sobre los puntos de referencia reconocidos.
Si el reconocimiento de puntos de referencia se realiza correctamente, se pasará una serie de objetosVisionCloudLandmark
al controlador de finalización. De cada objeto, puede obtener información sobre un punto de referencia reconocido en la imagen.Por ejemplo:
Rápido
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 }
C objetivo
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]; }
Próximos pasos
- Antes de implementar en producción una aplicación que utiliza una API de la nube, debe tomar algunas medidas adicionales para prevenir y mitigar el efecto del acceso no autorizado a la API .