Detecta puntos de referencia

La detección de puntos de referencia detecta estructuras populares naturales y artificiales en una imagen.

Imagen de la Catedral de San Basilio
Crédito de la imagen: Nikolay Vorobyev en Unsplash (anotaciones agregadas).

Solicitudes de detección de puntos de referencia

Configura el proyecto de GCP y la autenticación

quickstart,gcloud_init vision.googleapis.com Cloud Vision API SERVICE_ACCOUNT True env_var

Detecta puntos de referencia en una imagen local

La API de Vision puede realizar una detección de características en un archivo de imagen local si envía los contenidos del archivo de imagen como una string codificada en base64 en el cuerpo de la solicitud.

LÍNEA DE CMD Y REST

Antes de usar cualquiera de los datos de solicitud que se muestran a continuación, realiza los siguientes reemplazos:

  • base64-encoded-image: La representación en base64 (string ASCII) de los datos binarios de la imagen. Esta string debería ser similar a la siguiente:
    • /9j/4QAYRXhpZgAA...9tAVx/zDQDlGxn//2Q==
    Visita el tema codificación en base64 para obtener más información.

Método HTTP y URL:

POST https://vision.googleapis.com/v1/images:annotate

Cuerpo JSON de la solicitud:

    {
      "requests": [
        {
          "image": {
            "content": "base64-encoded-image"
          },
          "features": [
            {
              "maxResults": 10,
              "type": "LANDMARK_DETECTION"
            },
          ]
        }
      ]
    }
    

Para enviar tu solicitud, elige una de estas opciones:

curl

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
https://vision.googleapis.com/v1/images:annotate

PowerShell

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://vision.googleapis.com/v1/images:annotate" | Select-Object -Expand Content

Si la solicitud se completa de forma correcta, el servidor muestra un código de estado HTTP 200 OK y la respuesta en formato JSON.

Respuesta:

    {
      "responses": [
        {
          "landmarkAnnotations": [
            {
              "mid": "/m/014lft",
              "description": "Saint Basil's Cathedral",
              "score": 0.7840959,
              "boundingPoly": {
                "vertices": [
                  {
                    "x": 812,
                    "y": 1058
                  },
                  {
                    "x": 2389,
                    "y": 1058
                  },
                  {
                    "x": 2389,
                    "y": 3052
                  },
                  {
                    "x": 812,
                    "y": 3052
                  }
                ]
              },
              "locations": [
                {
                  "latLng": {
                    "latitude": 55.752912,
                    "longitude": 37.622315883636475
                  }
                }
              ]
            }
          ]
        }
      ]
    }
    

C#

Antes de probar esta muestra, sigue las instrucciones de configuración de C# que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para C#.

// Load an image from a local file.
    var image = Image.FromFile(filePath);
    var client = ImageAnnotatorClient.Create();
    var response = client.DetectLandmarks(image);
    foreach (var annotation in response)
    {
        if (annotation.Description != null)
            Console.WriteLine(annotation.Description);
    }

Go

Antes de probar esta muestra, sigue las instrucciones de configuración de Go que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para Go.


    // detectLandmarks gets landmarks from the Vision API for an image at the given file path.
    func detectLandmarks(w io.Writer, file string) error {
    	ctx := context.Background()

    	client, err := vision.NewImageAnnotatorClient(ctx)
    	if err != nil {
    		return err
    	}

    	f, err := os.Open(file)
    	if err != nil {
    		return err
    	}
    	defer f.Close()

    	image, err := vision.NewImageFromReader(f)
    	if err != nil {
    		return err
    	}
    	annotations, err := client.DetectLandmarks(ctx, image, nil, 10)
    	if err != nil {
    		return err
    	}

    	if len(annotations) == 0 {
    		fmt.Fprintln(w, "No landmarks found.")
    	} else {
    		fmt.Fprintln(w, "Landmarks:")
    		for _, annotation := range annotations {
    			fmt.Fprintln(w, annotation.Description)
    		}
    	}

    	return nil
    }
    

Java

Antes de probar esta muestra, sigue las instrucciones de configuración de Java que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para Java.

public static void detectLandmarks(String filePath, PrintStream out) throws Exception,
        IOException {
      List<AnnotateImageRequest> requests = new ArrayList<>();
      ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath));

      Image img = Image.newBuilder().setContent(imgBytes).build();
      Feature feat = Feature.newBuilder().setType(Type.LANDMARK_DETECTION).build();
      AnnotateImageRequest request =
          AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
      requests.add(request);

      try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
        BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
        List<AnnotateImageResponse> responses = response.getResponsesList();

        for (AnnotateImageResponse res : responses) {
          if (res.hasError()) {
            out.printf("Error: %s\n", res.getError().getMessage());
            return;
          }

          // For full list of available annotations, see http://g.co/cloud/vision/docs
          for (EntityAnnotation annotation : res.getLandmarkAnnotationsList()) {
            LocationInfo info = annotation.getLocationsList().listIterator().next();
            out.printf("Landmark: %s\n %s\n", annotation.getDescription(), info.getLatLng());
          }
        }
      }
    }

Node.js

Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para Node.js.

const vision = require('@google-cloud/vision');

    // Creates a client
    const client = new vision.ImageAnnotatorClient();

    /**
     * TODO(developer): Uncomment the following line before running the sample.
     */
    // const fileName = 'Local image file, e.g. /path/to/image.png';

    // Performs landmark detection on the local file
    const [result] = await client.landmarkDetection(fileName);
    const landmarks = result.landmarkAnnotations;
    console.log('Landmarks:');
    landmarks.forEach(landmark => console.log(landmark));

PHP

Antes de probar esta muestra, sigue las instrucciones de configuración de PHP que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para PHP.

namespace Google\Cloud\Samples\Vision;

    use Google\Cloud\Vision\V1\ImageAnnotatorClient;

    // $path = 'path/to/your/image.jpg1'

    function detect_landmark($path)
    {
        $imageAnnotator = new ImageAnnotatorClient();

        # annotate the image
        $image = file_get_contents($path);
        $response = $imageAnnotator->landmarkDetection($image);
        $landmarks = $response->getLandmarkAnnotations();

        printf('%d landmark found:' . PHP_EOL, count($landmarks));
        foreach ($landmarks as $landmark) {
            print($landmark->getDescription() . PHP_EOL);
        }

        $imageAnnotator->close();
    }

Python

Antes de probar esta muestra, sigue las instrucciones de configuración de Python que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para Python.

def detect_landmarks(path):
        """Detects landmarks in the file."""
        from google.cloud import vision
        import io
        client = vision.ImageAnnotatorClient()

        with io.open(path, 'rb') as image_file:
            content = image_file.read()

        image = vision.types.Image(content=content)

        response = client.landmark_detection(image=image)
        landmarks = response.landmark_annotations
        print('Landmarks:')

        for landmark in landmarks:
            print(landmark.description)
            for location in landmark.locations:
                lat_lng = location.lat_lng
                print('Latitude {}'.format(lat_lng.latitude))
                print('Longitude {}'.format(lat_lng.longitude))

        if response.error.message:
            raise Exception(
                '{}\nFor more info on error messages, check: '
                'https://cloud.google.com/apis/design/errors'.format(
                    response.error.message))

Ruby

Antes de probar esta muestra, sigue las instrucciones de configuración de Ruby que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para Ruby.

# image_path = "Path to local image file, eg. './image.png'"

    require "google/cloud/vision"

    image_annotator = Google::Cloud::Vision::ImageAnnotator.new

    response = image_annotator.landmark_detection image: image_path

    response.responses.each do |res|
      res.landmark_annotations.each do |landmark|
        puts landmark.description

        landmark.locations.each do |location|
          puts "#{location.lat_lng.latitude}, #{location.lat_lng.longitude}"
        end
      end
    end

Detecta puntos de referencia en una imagen remota

Para tu comodidad, la API de Vision puede realizar una detección de características directamente en un archivo de imagen ubicado en Google Cloud Storage o en la Web, sin necesidad de enviar el contenido del archivo de imagen en el cuerpo de tu solicitud.

LÍNEA DE CMD Y REST

Antes de usar cualquiera de los datos de solicitud que se muestran a continuación, realiza los siguientes reemplazos:

  • cloud-storage-image-uri: La ruta de acceso a un archivo de imagen válido en un depósito de Cloud Storage. Como mínimo, debes tener privilegios de lectura en el archivo. Ejemplo:
    • gs://cloud-samples-data/vision/landmark/st_basils.jpeg

Método HTTP y URL:

POST https://vision.googleapis.com/v1/images:annotate

Cuerpo JSON de la solicitud:

    {
      "requests": [
        {
          "image": {
            "source": {
              "gcsImageUri": "cloud-storage-image-uri"
            }
          },
          "features": [
            {
              "maxResults": 10,
              "type": "LANDMARK_DETECTION"
            },
          ]
        }
      ]
    }
    

Para enviar tu solicitud, elige una de estas opciones:

curl

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
https://vision.googleapis.com/v1/images:annotate

PowerShell

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://vision.googleapis.com/v1/images:annotate" | Select-Object -Expand Content

Si la solicitud se completa de forma correcta, el servidor muestra un código de estado HTTP 200 OK y la respuesta en formato JSON.

Respuesta:

    {
      "responses": [
        {
          "landmarkAnnotations": [
            {
              "mid": "/m/014lft",
              "description": "Saint Basil's Cathedral",
              "score": 0.7840959,
              "boundingPoly": {
                "vertices": [
                  {
                    "x": 812,
                    "y": 1058
                  },
                  {
                    "x": 2389,
                    "y": 1058
                  },
                  {
                    "x": 2389,
                    "y": 3052
                  },
                  {
                    "x": 812,
                    "y": 3052
                  }
                ]
              },
              "locations": [
                {
                  "latLng": {
                    "latitude": 55.752912,
                    "longitude": 37.622315883636475
                  }
                }
              ]
            }
          ]
        }
      ]
    }
    

C#

Antes de probar esta muestra, sigue las instrucciones de configuración de C# que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para C#.

// Specify a Google Cloud Storage uri for the image
    // or a publicly accessible HTTP or HTTPS uri.
    var image = Image.FromUri(uri);
    var client = ImageAnnotatorClient.Create();
    var response = client.DetectLandmarks(image);
    foreach (var annotation in response)
    {
        if (annotation.Description != null)
            Console.WriteLine(annotation.Description);
    }

Go

Antes de probar esta muestra, sigue las instrucciones de configuración de Go que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para Go.


    // detectLandmarks gets landmarks from the Vision API for an image at the given file path.
    func detectLandmarksURI(w io.Writer, file string) error {
    	ctx := context.Background()

    	client, err := vision.NewImageAnnotatorClient(ctx)
    	if err != nil {
    		return err
    	}

    	image := vision.NewImageFromURI(file)
    	annotations, err := client.DetectLandmarks(ctx, image, nil, 10)
    	if err != nil {
    		return err
    	}

    	if len(annotations) == 0 {
    		fmt.Fprintln(w, "No landmarks found.")
    	} else {
    		fmt.Fprintln(w, "Landmarks:")
    		for _, annotation := range annotations {
    			fmt.Fprintln(w, annotation.Description)
    		}
    	}

    	return nil
    }
    

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración de Java en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para Java.

public static void detectLandmarksGcs(String gcsPath, PrintStream out) throws Exception,
        IOException {
      List<AnnotateImageRequest> requests = new ArrayList<>();

      ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build();
      Image img = Image.newBuilder().setSource(imgSource).build();
      Feature feat = Feature.newBuilder().setType(Type.LANDMARK_DETECTION).build();
      AnnotateImageRequest request =
          AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
      requests.add(request);

      try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
        BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
        List<AnnotateImageResponse> responses = response.getResponsesList();

        for (AnnotateImageResponse res : responses) {
          if (res.hasError()) {
            out.printf("Error: %s\n", res.getError().getMessage());
            return;
          }

          // For full list of available annotations, see http://g.co/cloud/vision/docs
          for (EntityAnnotation annotation : res.getLandmarkAnnotationsList()) {
            LocationInfo info = annotation.getLocationsList().listIterator().next();
            out.printf("Landmark: %s\n %s\n", annotation.getDescription(), info.getLatLng());
          }
        }
      }
    }

Node.js

Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para Node.js.

// Imports the Google Cloud client libraries
    const vision = require('@google-cloud/vision');

    // Creates a client
    const client = new vision.ImageAnnotatorClient();

    /**
     * TODO(developer): Uncomment the following lines before running the sample.
     */
    // const bucketName = 'Bucket where the file resides, e.g. my-bucket';
    // const fileName = 'Path to file within bucket, e.g. path/to/image.png';

    // Performs landmark detection on the gcs file
    const [result] = await client.landmarkDetection(
      `gs://${bucketName}/${fileName}`
    );
    const landmarks = result.landmarkAnnotations;
    console.log('Landmarks:');
    landmarks.forEach(landmark => console.log(landmark));

PHP

Antes de probar esta muestra, sigue las instrucciones de configuración de PHP que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para PHP.

namespace Google\Cloud\Samples\Vision;

    use Google\Cloud\Vision\V1\ImageAnnotatorClient;

    // $path = 'gs://path/to/your/image.jpg'

    function detect_landmark_gcs($path)
    {
        $imageAnnotator = new ImageAnnotatorClient();

        # annotate the image
        $response = $imageAnnotator->landmarkDetection($path);
        $landmarks = $response->getLandmarkAnnotations();

        printf('%d landmark found:' . PHP_EOL, count($landmarks));
        foreach ($landmarks as $landmark) {
            print($landmark->getDescription() . PHP_EOL);
        }

        $imageAnnotator->close();
    }

Python

Antes de probar esta muestra, sigue las instrucciones de configuración de Python que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para Python.

def detect_landmarks_uri(uri):
        """Detects landmarks in the file located in Google Cloud Storage or on the
        Web."""
        from google.cloud import vision
        client = vision.ImageAnnotatorClient()
        image = vision.types.Image()
        image.source.image_uri = uri

        response = client.landmark_detection(image=image)
        landmarks = response.landmark_annotations
        print('Landmarks:')

        for landmark in landmarks:
            print(landmark.description)

        if response.error.message:
            raise Exception(
                '{}\nFor more info on error messages, check: '
                'https://cloud.google.com/apis/design/errors'.format(
                    response.error.message))

Ruby

Antes de probar esta muestra, sigue las instrucciones de configuración de Ruby que se encuentran en la Guía de inicio rápido de la API de Vision sobre cómo usar bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Vision para Ruby.

# image_path = "Google Cloud Storage URI, eg. 'gs://my-bucket/image.png'"

    require "google/cloud/vision"

    image_annotator = Google::Cloud::Vision::ImageAnnotator.new

    response = image_annotator.landmark_detection image: image_path

    response.responses.each do |res|
      res.landmark_annotations.each do |landmark|
        puts landmark.description

        landmark.locations.each do |location|
          puts "#{location.lat_lng.latitude}, #{location.lat_lng.longitude}"
        end
      end
    end

Comando de gcloud

Para realizar una detección de puntos de referencia, usa el comando gcloud ml vision detect-landmarks como se muestra en el siguiente ejemplo:

    gcloud ml vision detect-landmarks gs://cloud-samples-data/vision/landmark/st_basils.jpeg
    

Pruébala

Prueba la detección de puntos de referencia que se muestra a continuación. Puedes usar la imagen ya especificada (gs://cloud-samples-data/vision/landmark/st_basils.jpeg) o especificar tu propia imagen en su lugar. Si deseas enviar la solicitud, selecciona Ejecutar.

Imagen de la Catedral de San Basilio
Crédito de la imagen: Nikolay Vorobyev en Unsplash.