Detecta sugerencias de recorte

Las sugerencias de recorte sugieren vértices para una región de recorte en una imagen.

Imagen antes del recorte
Crédito de la imagen: Yasmin Dangor en Unsplash (se muestra la imagen original y la recortada).

Sugerencia de recorte aplicada (relación de 2:1):

Imagen después del recorte

Solicitudes de detección de sugerencias de recorte

Configura el proyecto de GCP y la autenticación

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

Detecta sugerencias de recorte 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 REST Y CMD

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.

Consideraciones específicas del campo:

  • cropHintsParams.aspectRatios: Un valor flotante que corresponde a las proporciones especificadas para tus imágenes (ancho:alto). Puedes proporcionar hasta 16 relaciones de recorte.

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": [
            {
              "type": "CROP_HINTS"
            }
          ],
          "imageContext": {
            "cropHintsParams": {
              "aspectRatios": [
                 2.0
              ]
            }
          }
        }
      ]
    }
    

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": [
        {
          "cropHintsAnnotation": {
            "cropHints": [
              {
                "boundingPoly": {
                  "vertices": [
                    {
                      "y": 520
                    },
                    {
                      "x": 2369,
                      "y": 520
                    },
                    {
                      "x": 2369,
                      "y": 1729
                    },
                    {
                      "y": 1729
                    }
                  ]
                },
                "confidence": 0.79999995,
                "importanceFraction": 0.66999996
              }
            ]
          }
        }
      ]
    }
    

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();
    CropHintsAnnotation annotation = client.DetectCropHints(image);
    foreach (CropHint hint in annotation.CropHints)
    {
        Console.WriteLine("Confidence: {0}", hint.Confidence);
        Console.WriteLine("ImportanceFraction: {0}", hint.ImportanceFraction);
        Console.WriteLine("Bounding Polygon:");
        foreach (Vertex vertex in hint.BoundingPoly.Vertices)
        {
            Console.WriteLine("\tX:\t{0}\tY:\t{1}", vertex.X, vertex.Y);
        }
    }

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.


    // detectCropHints gets suggested croppings the Vision API for an image at the given file path.
    func detectCropHints(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
    	}
    	res, err := client.CropHints(ctx, image, nil)
    	if err != nil {
    		return err
    	}

    	fmt.Fprintln(w, "Crop hints:")
    	for _, hint := range res.CropHints {
    		for _, v := range hint.BoundingPoly.Vertices {
    			fmt.Fprintf(w, "(%d,%d)\n", v.X, v.Y)
    		}
    	}

    	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 detectCropHints(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.CROP_HINTS).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
          CropHintsAnnotation annotation = res.getCropHintsAnnotation();
          for (CropHint hint : annotation.getCropHintsList()) {
            out.println(hint.getBoundingPoly());
          }
        }
      }
    }

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 library
    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';

    // Find crop hints for the local file
    const [result] = await client.cropHints(fileName);
    const cropHints = result.cropHintsAnnotation;
    cropHints.cropHints.forEach((hintBounds, hintIdx) => {
      console.log(`Crop Hint ${hintIdx}:`);
      hintBounds.boundingPoly.vertices.forEach((bound, boundIdx) => {
        console.log(`  Bound ${boundIdx}: (${bound.x}, ${bound.y})`);
      });
    });

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.jpg'

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

        # annotate the image
        $image = file_get_contents($path);
        $response = $imageAnnotator->cropHintsDetection($image);
        $annotations = $response->getCropHintsAnnotation();

        # print the crop hints from the annotation
        if ($annotations) {
            print("Crop hints:" . PHP_EOL);
            foreach ($annotations->getCropHints() as $hint) {
                # get bounds
                $vertices = $hint->getBoundingPoly()->getVertices();
                $bounds = [];
                foreach ($vertices as $vertex) {
                    $bounds[] = sprintf('(%d,%d)', $vertex->getX(),
                        $vertex->getY());
                }
                print('Bounds: ' . join(', ', $bounds) . PHP_EOL);
            }
        } else {
            print('No crop hints' . 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_crop_hints(path):
        """Detects crop hints in an image."""
        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)

        crop_hints_params = vision.types.CropHintsParams(aspect_ratios=[1.77])
        image_context = vision.types.ImageContext(
            crop_hints_params=crop_hints_params)

        response = client.crop_hints(image=image, image_context=image_context)
        hints = response.crop_hints_annotation.crop_hints

        for n, hint in enumerate(hints):
            print('\nCrop Hint: {}'.format(n))

            vertices = (['({},{})'.format(vertex.x, vertex.y)
                        for vertex in hint.bounding_poly.vertices])

            print('bounds: {}'.format(','.join(vertices)))

        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.crop_hints_detection image: image_path

    response.responses.each do |res|
      puts "Crop hint bounds:"
      res.crop_hints_annotation.crop_hints.each do |crop_hint|
        crop_hint.bounding_poly.vertices.each do |bound|
          puts "#{bound.x}, #{bound.y}"
        end
      end
    end

Detecta sugerencias de recorte 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 REST Y CMD

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/crop_hints/bubble.jpeg

Consideraciones específicas del campo:

  • cropHintsParams.aspectRatios: Un valor flotante que corresponde a las proporciones especificadas para tus imágenes (ancho:alto). Puedes proporcionar hasta 16 relaciones de recorte.

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": [
            {
              "type": "CROP_HINTS"
            }
          ],
          "imageContext": {
            "cropHintsParams": {
              "aspectRatios": [
                 2.0
              ]
            }
          }
        }
      ]
    }
    

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": [
        {
          "cropHintsAnnotation": {
            "cropHints": [
              {
                "boundingPoly": {
                  "vertices": [
                    {
                      "y": 520
                    },
                    {
                      "x": 2369,
                      "y": 520
                    },
                    {
                      "x": 2369,
                      "y": 1729
                    },
                    {
                      "y": 1729
                    }
                  ]
                },
                "confidence": 0.79999995,
                "importanceFraction": 0.66999996
              }
            ]
          }
        }
      ]
    }
    

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();
    CropHintsAnnotation annotation = client.DetectCropHints(image);
    foreach (CropHint hint in annotation.CropHints)
    {
        Console.WriteLine("Confidence: {0}", hint.Confidence);
        Console.WriteLine("ImportanceFraction: {0}", hint.ImportanceFraction);
        Console.WriteLine("Bounding Polygon:");
        foreach (Vertex vertex in hint.BoundingPoly.Vertices)
        {
            Console.WriteLine("\tX:\t{0}\tY:\t{1}", vertex.X, vertex.Y);
        }
    }

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 detectCropHintsGcs(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.CROP_HINTS).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
          CropHintsAnnotation annotation = res.getCropHintsAnnotation();
          for (CropHint hint : annotation.getCropHintsList()) {
            out.println(hint.getBoundingPoly());
          }
        }
      }
    }

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.


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

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

    	image := vision.NewImageFromURI(file)
    	res, err := client.CropHints(ctx, image, nil)
    	if err != nil {
    		return err
    	}

    	fmt.Fprintln(w, "Crop hints:")
    	for _, hint := range res.CropHints {
    		for _, v := range hint.BoundingPoly.Vertices {
    			fmt.Fprintf(w, "(%d,%d)\n", v.X, v.Y)
    		}
    	}

    	return nil
    }
    

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';

    // Find crop hints for the remote file
    const [result] = await client.cropHints(`gs://${bucketName}/${fileName}`);
    const cropHints = result.cropHintsAnnotation;
    cropHints.cropHints.forEach((hintBounds, hintIdx) => {
      console.log(`Crop Hint ${hintIdx}:`);
      hintBounds.boundingPoly.vertices.forEach((bound, boundIdx) => {
        console.log(`  Bound ${boundIdx}: (${bound.x}, ${bound.y})`);
      });
    });

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_crop_hints_gcs($path)
    {
        $imageAnnotator = new ImageAnnotatorClient();

        # annotate the image
        $response = $imageAnnotator->cropHintsDetection($path);
        $annotations = $response->getCropHintsAnnotation();

        # print the crop hints from the annotation
        if ($annotations) {
            print("Crop hints:" . PHP_EOL);
            foreach ($annotations->getCropHints() as $hint) {
                # get bounds
                $vertices = $hint->getBoundingPoly()->getVertices();
                $bounds = [];
                foreach ($vertices as $vertex) {
                    $bounds[] = sprintf('(%d,%d)', $vertex->getX(),
                        $vertex->getY());
                }
                print('Bounds: ' . join(', ', $bounds) . PHP_EOL);
            }
        } else {
            print('No crop hints' . 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_crop_hints_uri(uri):
        """Detects crop hints in the file located in Google Cloud Storage."""
        from google.cloud import vision
        client = vision.ImageAnnotatorClient()
        image = vision.types.Image()
        image.source.image_uri = uri

        crop_hints_params = vision.types.CropHintsParams(aspect_ratios=[1.77])
        image_context = vision.types.ImageContext(
            crop_hints_params=crop_hints_params)

        response = client.crop_hints(image=image, image_context=image_context)
        hints = response.crop_hints_annotation.crop_hints

        for n, hint in enumerate(hints):
            print('\nCrop Hint: {}'.format(n))

            vertices = (['({},{})'.format(vertex.x, vertex.y)
                        for vertex in hint.bounding_poly.vertices])

            print('bounds: {}'.format(','.join(vertices)))

        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.crop_hints_detection image: image_path

    response.responses.each do |res|
      puts "Crop hint bounds:"
      res.crop_hints_annotation.crop_hints.each do |crop_hint|
        crop_hint.bounding_poly.vertices.each do |bound|
          puts "#{bound.x}, #{bound.y}"
        end
      end
    end

Comando de gcloud

Si quieres realizar una detección de texto, usa el comando gcloud ml vision suggest-crop como se muestra en el siguiente ejemplo:

    gcloud ml vision suggest-crop gs://cloud-samples-data/vision/crop_hints/bubble.jpeg
    

Pruébala

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

Imagen antes del recorte
Crédito de la imagen: Yasmin Dangor en Unsplash.