Ir a la consola

Reconoce puntos de referencia con el Kit de AA en iOS

Puedes usar el Kit de AA para reconocer puntos de referencia famosos en una imagen.

Consulta la muestra de inicio rápido del Kit de AA en GitHub para ver un ejemplo de esta API en uso.

Antes de comenzar

  1. Si aún no agregaste Firebase a tu app, sigue los pasos en la guía de introducción para hacerlo.
  2. Incluye las bibliotecas del Kit de AA en el Podfile:
    pod 'Firebase/Core'
    pod 'Firebase/MLVision'
    
    Después de instalar o actualizar los pods de tu proyecto, asegúrate de abrir el proyecto de Xcode a través de su .xcworkspace.
  3. En tu app, importa Firebase:

    Swift

    import Firebase

    Objective-C

    @import Firebase;
  4. Si no actualizaste tu proyecto a un plan Blaze, hazlo en Firebase console. Solo los proyectos con un plan Blaze pueden usar las API de Cloud Vision.
  5. En Google Cloud Console, habilita la API de Cloud Vision:
    1. Abre la API de Cloud Vision en la biblioteca de API de Cloud Console.
    2. Asegúrate de que tu proyecto de Firebase se encuentre seleccionado en el menú ubicado en la parte superior de la página.
    3. Si la API no está habilitada, haz clic en Habilitar.

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ícalas con un objeto VisionCloudDetectorOptions, como 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, pasa la imagen 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. Crea un objeto VisionImage con una UIImage o CMSampleBufferRef.

    Para usar una UIImage:

    1. Si es necesario, rota la imagen para que la propiedad imageOrientation sea .up.
    2. Usa una UIImage que se haya rotado correctamente para crear un objeto VisionImage. No especifiques los metadatos de rotación. Se debe usar el valor predeterminado .topLeft.

      Swift

      let image = VisionImage(image: uiImage)

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
      

    Para usar una CMSampleBufferRef:

    1. Crea un objeto VisionImageMetadata que especifique la orientación de los datos de la imagen contenidos en el búfer CMSampleBufferRef.

      Por ejemplo, si los datos de la imagen deben rotarse 90° hacia la derecha para que tengan una orientación vertical:

      Swift

      let metadata = VisionImageMetadata()
      metadata.orientation = .rightTop  // Row 0 is on the right and column 0 is on the top
      

      Objective-C

      // Row 0 is on the right and column 0 is on the top
      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      metadata.orientation = FIRVisionDetectorImageOrientationRightTop;
      
    2. Crea un objeto VisionImage a través del objeto CMSampleBufferRef y los metadatos de rotación:

      Swift

      let image = VisionImage(buffer: bufferRef)
      image.metadata = metadata
      

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:buffer];
      image.metadata = metadata;
      
  3. Luego, 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 los puntos de referencia se ejecuta correctamente, una matriz de objetos VisionCloudLandmark se pasará 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];
}