Ir para o console

Reconhecer pontos de referência com o Kit ML no Android

É possível usar o ML Kit para reconhecer pontos de referência conhecidos em uma imagem.

Antes de começar

  1. Configure um projeto do Firebase:
    1. Crie um projeto do Firebase no Firebase console, caso você ainda não tenha um. Se você já tiver um projeto do Google associado ao aplicativo para dispositivos móveis, clique em Importar projeto do Google. Do contrário, clique em Adicionar projeto.
    2. Clique em Adicionar o Firebase ao aplicativo para Android e siga as etapas de configuração. Se você estiver importando um projeto existente do Google, isso poderá acontecer automaticamente. Basta fazer o download do arquivo de configuração.
    3. Quando solicitado, digite o nome do pacote do app. É importante inserir o nome do pacote que o app está usando. Isso só poderá ser definido quando você adicionar um app ao projeto do Firebase.
    4. Ao final, você fará o download de um arquivo google-services.json. É possível fazer o download do arquivo de configuração novamente a qualquer momento.
    5. Caso ainda não tenha feito isso, copie o arquivo para a pasta do módulo do projeto, normalmente app/.
  2. Extraia o SDK recebido do contato EAP:
    unzip -d $SDK_DIR 3p_sdk.m2repo.zip
    
  3. Adicione o diretório no qual você incluiu o SDK e o plug-in google-services ao build.gradle do nível do projeto:
    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. Em seguida, inclua a dependência do ML Kit e adicione a linha apply plugin ao arquivo build.gradle do nível do projeto:

    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'
    

Configurar o detector de ponto de referência

Por padrão, o detector do Cloud usa a versão STABLE do modelo e retorna até 10 resultados. Se você quiser alterar alguma dessas configurações, especifique-as com um objeto FirebaseVisionCloudDetectorOptions.

Por exemplo, para alterar as duas configurações padrão, crie um objeto FirebaseVisionCloudDetectorOptions como é mostrado a seguir:

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

Para aplicar as configurações padrão, é possível usar FirebaseVisionCloudDetectorOptions.DEFAULT na próxima etapa.

Executar o detector de ponto de referência

Para reconhecer pontos de referência em uma imagem, passe a imagem como um objeto ByteBuffer ao método FirebaseVisionCloudLandmarkDetector de detectInBuffer ou como um objeto android.graphics.Bitmap ao método detectInImage.

  1. Receba uma instância de FirebaseVisionCloudLandmarkDetector:

    FirebaseVisionCloudLandmarkDetector detector = FirebaseVision.getInstance()
        .getVisionCloudLandmarkDetector(options);
    
  2. Crie um objeto FirebaseVisionImageMetadata que contenha os metadados da imagem.

    Se estiver passando a imagem como um ByteBuffer, você precisará especificar a altura, a largura, o formato de codificação da cor e a orientação da imagem:

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

    Se você estiver passando a imagem como um Bitmap, bastará especificar a orientação da imagem:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    
  3. Por fim, passe a imagem ao método detectInBuffer ou 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
                // ...
              }
            });
    

Receber informações sobre os pontos de referência reconhecidos

Se a operação de reconhecimento de ponto de referência for bem-sucedida, uma matriz de objetos FirebaseVisionCloudLandmark será passada ao listener de êxito. Cada objeto FirebaseVisionCloudLandmark representa um ponto de referência reconhecido na imagem. Para cada ponto de referência, é possível receber as coordenadas delimitadoras na imagem de entrada, o nome do ponto de referência, a latitude e a longitude, o código da entidade do Mapa do conhecimento dele (se disponível) e a pontuação de confiança da correspondência. Por exemplo:

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();
  }
}