Reconoce puntos de referencia con AA de Firebase en iOS

Puedes usar Firebase ML para reconocer puntos de referencia conocidos en una imagen.

Antes de comenzar

    Si aún no agregaste Firebase a tu app, sigue los pasos en la guía de introducción para hacerlo.

    Usa Swift Package Manager para instalar y administrar las dependencias de Firebase.

    1. En Xcode, con tu proyecto de app abierto, navega a File > Add Packages.
    2. Cuando se te solicite, agrega el repositorio del SDK de Firebase para plataformas de Apple:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Elige la biblioteca de Firebase ML.
    5. Agrega la marca -ObjC a la sección Other Linker Flags de la configuración de compilación de tu destino.
    6. Cuando termines, Xcode comenzará a resolver y descargar automáticamente tus dependencias en segundo plano.

    A continuación, realiza la configuración en la app:

    1. En tu app, importa Firebase:

      Swift

      import FirebaseMLModelDownloader

      Objective-C

      @import FirebaseMLModelDownloader;
  1. Si aún no habilitaste las APIs de Cloud en tu proyecto, hazlo de la siguiente manera:

    1. Abre la Firebase ML Página de APIs de Firebase console.
    2. Si todavía no actualizaste tu proyecto a un plan de precios Blaze, haz clic en Actualizar para hacerlo (se te pedirá que realices la actualización únicamente si tu proyecto no está en el plan Blaze).

      Solo los proyectos con un plan Blaze pueden usar las APIs de Cloud.

    3. Si las APIs de Cloud no están habilitadas, haz clic en Habilitar las APIs de Cloud.

Configura el detector de puntos de referencia

Según la configuración predeterminada, el detector de Cloud usa la versión estable del modelo y muestra hasta 10 resultados. Si quieres cambiar alguna de estas opciones de configuración, especifícala con un objeto VisionCloudDetectorOptions como se muestra en el siguiente ejemplo:

Swift

let options = VisionCloudDetectorOptions()
options.modelType = .latest
options.maxResults = 20

Objective-C

  FIRVisionCloudDetectorOptions *options =
      [[FIRVisionCloudDetectorOptions alloc] init];
  options.modelType = FIRVisionCloudModelTypeLatest;
  options.maxResults = 20;
  

En el siguiente ejemplo, pasa el objeto VisionCloudDetectorOptions cuando crees el objeto del detector de Cloud.

Ejecuta el detector de puntos de referencia

Para reconocer puntos de referencia en una imagen, pásala como una UIImage o una CMSampleBufferRef al método detect(in:) de VisionCloudLandmarkDetector:

  1. Obtén una instancia de 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];
  2. Para llamar a Cloud Vision, la imagen debe tener el formato de una string codificada en base64. Para procesar una UIImage, sigue estos pasos:

    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];
  3. Por último, pasa la imagen al método 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
      }
    }];

Obtén información sobre los puntos de referencia reconocidos

Si el reconocimiento de puntos de referencia se ejecuta correctamente, se pasará un array de objetos VisionCloudLandmark al controlador de finalización. Podrás obtener información sobre un punto de referencia reconocido en la imagen en cada objeto.

Por ejemplo:

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

Próximos pasos