Ir a la consola

Reconoce puntos de referencia con el Kit de AA en Android

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

Antes de comenzar

  1. Configura un proyecto de Firebase:
    1. Crea un proyecto en Firebase console si no lo hiciste antes. Si ya tienes un proyecto de Google existente asociado con tu app para dispositivos móviles, haz clic en Importar proyecto de Google. De lo contrario, haz clic en Agregar proyecto.
    2. Haz clic en Agrega Firebase a tu app para Android y sigue los pasos de la configuración. Si estás importando un proyecto de Google existente, es posible que esto ocurra de forma automática y solo tengas que descargar el archivo de configuración.
    3. Ingresa el nombre del paquete de la app cuando se te solicite. Es importante que ingreses el nombre de paquete que tu app está usando. Esto solo se puede configurar cuando agregas una app a tu proyecto de Firebase.
    4. Para finalizar el proceso, descargarás un archivo google-services.json. Puedes volver a descargar el archivo de configuración en cualquier momento.
    5. Si todavía no lo has hecho, copia esto en la carpeta del módulo de tu proyecto, que generalmente es app/.
  2. Extrae el SDK que recibiste de tu contacto de EAP:
    unzip -d $SDK_DIR 3p_sdk.m2repo.zip
    
  3. Agrega el directorio en el que extrajiste el SDK y el complemento de Servicios de Google al archivo build.gradle del nivel de tu proyecto:
    buildscript {
      // ...
      dependencies {
          // ...
          classpath 'com.google.gms:google-services:3.2.0' // google-services plugin
      }
    }
    
    allprojects {
      repositories {
        // Add this
        maven {
          url "$SDK_DIR"
        }
        // This should already be here
        jcenter()
    
        ...
      }
    }
    
  4. Luego, incluye la dependencia para el Kit de AA y agrega la línea apply plugin al archivo build.gradle del nivel de tu app:

    dependencies {
      // ...
      compile 'com.google.firebase:firebase-core:12.8.0-SNAPSHOT'
      compile 'com.google.firebase:firebase-ml-vision:12.8.0-SNAPSHOT'
    }
    
    // ADD THIS AT THE BOTTOM OF THE FILE
    apply plugin: 'com.google.gms.google-services'
    

Configura el detector de puntos de referencia

Según la configuración predeterminada, el detector de Cloud usa la versión STABLE del modelo y muestra hasta 10 resultados. Si deseas modificar esta configuración, especifica los ajustes con un objeto FirebaseVisionCloudDetectorOptions.

Por ejemplo, para cambiar ambos elementos de la configuración predeterminada, compila un objeto FirebaseVisionCloudDetectorOptions como el siguiente:

FirebaseVisionCloudDetectorOptions options =
    new FirebaseVisionCloudDetectorOptions.Builder()
        .setModelType(FirebaseVisionCloudDetectorOptions.LATEST_MODEL)
        .setMaxResults(15)
        .build();

Para usar la configuración predeterminada, puedes usar FirebaseVisionCloudDetectorOptions.DEFAULT en el siguiente paso.

Ejecuta el detector de puntos de referencia

Para reconocer puntos de referencia en una imagen, pasa la imagen como un objeto ByteBuffer al método FirebaseVisionCloudLandmarkDetector de detectInBuffer o como un objeto android.graphics.Bitmap al método detectInImage.

  1. Obtén una instancia de FirebaseVisionCloudLandmarkDetector:

    FirebaseVisionCloudLandmarkDetector detector = FirebaseVision.getInstance()
        .getVisionCloudLandmarkDetector(options);
    
  2. Crea un objeto FirebaseVisionImageMetadata que contenga los metadatos de la imagen.

    Si pasas la imagen como un ByteBuffer, debes especificar su altura, ancho, formato de codificación del color y orientación:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setWidth(1280)
        .setHeight(720)
        .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    

    Si pasas la imagen como un Bitmap, solo debes especificar su orientación:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    
  3. Por último, pasa la imagen al método detectInBuffer o detectInImage:

    Task<SparseArray<FirebaseVisionCloudLandmark>> result =
        detector.detectInImage(image, metadata)  // or detectInBuffer(buffer, metadata)
        .addOnSuccessListener(
            this,
            new OnSuccessListener<SparseArray<FirebaseVisionCloudLandmark>>() {
              @Override
              public void onSuccess(SparseArray<FirebaseVisionCloudLandmark> landmarks) {
                // Task completed successfully
                // ...
              }
            })
        .addOnFailureListener(
            this,
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Task failed with an exception
                // ...
              }
            });
    

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

Si la operación de reconocimiento de puntos de referencia se ejecuta correctamente, se pasará un arreglo de objetos FirebaseVisionCloudLandmark al agente de escucha que detecta el resultado correcto. Cada objeto FirebaseVisionCloudLandmark representa un punto de referencia que se reconoció en la imagen. Para cada punto de referencia, puedes obtener las coordenadas de sus límites en la imagen de entrada, su nombre, ID de entidad del Gráfico de conocimiento (si está disponible) y puntuación de confianza de la coincidencia. Por ejemplo:

for(int i = 0; i < landmarks.size(); i++) {
  FirebaseVisionCloudLandmark landmark = landmarks.valueAt(i);

  Rect bounds = landmark.getBoundingBox();
  String landmarkName = landmark.getlandmark();
  String entityId = landmark.getEntityId();
  float confidence = landmark.getScore();

  // Multiple locations are possible, e.g., the location of the depicted
  // landmark and the location the picture was taken.
  for (FirebaseVisionLatLng loc: landmark.getLocations()) {
    double latitude = loc.getLatitude();
    double longitude = loc.getLongitude();
  }
}