Détecter les suggestions de cadrage

Les suggestions de cadrage suggèrent des sommets (ou "vertex") pour cadrer une zone d'une image.

Image avant recadrage
Image credit : Yasmin Dangor sur Unsplash (image d'origine et cadrée affichée).

Suggestion de cadrage appliquée (ratio 2:1) :

Image après recadrage

Requêtes de détection de suggestions de recadrage

Configurer votre authentification et votre projet GCP

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

Détecter les suggestions de recadrage sur une image locale

L'API Vision peut détecter des fonctionnalités dans un fichier image local en envoyant le contenu du fichier image en tant que chaîne encodée en base64 dans le corps de votre requête.

API REST et ligne de commande

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • base64-encoded-image : représentation en base64 (chaîne ASCII) de vos données d'image binaire. Cette chaîne doit ressembler à la chaîne suivante :
    • /9j/4QAYRXhpZgAA...9tAVx/zDQDlGxn//2Q==
    Consultez la rubrique encodage en base64 pour en savoir plus.

Remarques sur les champs :

  • cropHintsParams.aspectRatios : valeur flottante correspondant au ratio spécifié pour vos images (largeur:hauteur). Vous pouvez fournir jusqu'à 16 ratios de recadrage.

Méthode HTTP et URL :

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

Corps JSON de la requête :

    {
      "requests": [
        {
          "image": {
            "content": "base64-encoded-image"
          },
          "features": [
            {
              "type": "CROP_HINTS"
            }
          ],
          "imageContext": {
            "cropHintsParams": {
              "aspectRatios": [
                 2.0
              ]
            }
          }
        }
      ]
    }
    

Pour envoyer votre requête, choisissez l'une des options suivantes :

curl

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

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

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

$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 requête aboutit, le serveur renvoie un code d'état HTTP 200 OK et la réponse au format JSON.

Réponse :

    

    {
      "responses": [
        {
          "cropHintsAnnotation": {
            "cropHints": [
              {
                "boundingPoly": {
                  "vertices": [
                    {
                      "y": 520
                    },
                    {
                      "x": 2369,
                      "y": 520
                    },
                    {
                      "x": 2369,
                      "y": 1729
                    },
                    {
                      "y": 1729
                    }
                  ]
                },
                "confidence": 0.79999995,
                "importanceFraction": 0.66999996
              }
            ]
          }
        }
      ]
    }
    

C#

Avant d'essayer cet exemple, suivez les instructions de configuration de C# dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour plus d'informations, consultez la documentation de référence de l'API Vision 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

Avant d'essayer cet exemple, suivez les instructions de configuration de Go dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour plus d'informations, consultez la documentation de référence de l'API Vision 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

Avant d'essayer cet exemple, suivez les instructions de configuration de Java dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vision pour 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

Avant d'essayer cet exemple, suivez les instructions de configuration de Node.js dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vision 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

Avant d'essayer cet exemple, suivez les instructions de configuration de PHP dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vision 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

Avant d'essayer cet exemple, suivez les instructions de configuration de Python dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vision 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

Avant d'essayer cet exemple, suivez les instructions de configuration de Ruby dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vision 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

Détecter des suggestions de cadrage sur une image distante

Pour plus de facilité, l'API Vision peut directement détecter des fonctionnalités dans un fichier image de Google Cloud Storage ou sur le Web sans envoyer le contenu du fichier image dans le corps de votre requête.

API REST et ligne de commande

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • cloud-storage-image-uri : chemin d'accès à un fichier image valide dans un bucket Cloud Storage. Il faut au minimum disposer des droits en lecture sur le fichier. Exemple :
    • gs://cloud-samples-data/vision/crop_hints/bubble.jpeg

Remarques sur les champs :

  • cropHintsParams.aspectRatios : valeur flottante correspondant au ratio spécifié pour vos images (largeur:hauteur). Vous pouvez fournir jusqu'à 16 ratios de recadrage.

Méthode HTTP et URL :

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

Corps JSON de la requête :

    {
      "requests": [
        {
          "image": {
            "source": {
              "gcsImageUri": "cloud-storage-image-uri"
            }
          },
          "features": [
            {
              "type": "CROP_HINTS"
            }
          ],
          "imageContext": {
            "cropHintsParams": {
              "aspectRatios": [
                 2.0
              ]
            }
          }
        }
      ]
    }
    

Pour envoyer votre requête, choisissez l'une des options suivantes :

curl

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

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

Enregistrez le corps de la requête dans un fichier nommé request.json, puis exécutez la commande suivante :

$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 requête aboutit, le serveur renvoie un code d'état HTTP 200 OK et la réponse au format JSON.

Réponse :

    

    {
      "responses": [
        {
          "cropHintsAnnotation": {
            "cropHints": [
              {
                "boundingPoly": {
                  "vertices": [
                    {
                      "y": 520
                    },
                    {
                      "x": 2369,
                      "y": 520
                    },
                    {
                      "x": 2369,
                      "y": 1729
                    },
                    {
                      "y": 1729
                    }
                  ]
                },
                "confidence": 0.79999995,
                "importanceFraction": 0.66999996
              }
            ]
          }
        }
      ]
    }
    

C#

Avant d'essayer cet exemple, suivez les instructions de configuration de C# dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour plus d'informations, consultez la documentation de référence de l'API Vision 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

Avant d'essayer cet exemple, suivez les instructions de configuration de Java dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vision 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

Avant d'essayer cet exemple, suivez les instructions de configuration de Go dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour plus d'informations, consultez la documentation de référence de l'API Vision 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

Avant d'essayer cet exemple, suivez les instructions de configuration de Node.js dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vision 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

Avant d'essayer cet exemple, suivez les instructions de configuration de PHP dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vision 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

Avant d'essayer cet exemple, suivez les instructions de configuration de Python dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vision 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

Avant d'essayer cet exemple, suivez les instructions de configuration de Ruby dans le guide de démarrage rapide de l'API Vision à l'aide des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Vision 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

Commande gcloud

Pour effectuer une détection de texte, utilisez la commande gcloud ml vision suggest-crop comme indiqué dans l'exemple suivant :

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

Essayer

Essayez la détection des suggestions de cadrage ci-dessous. Vous pouvez utiliser l'image déjà spécifiée gs://cloud-samples-data/vision/crop_hints/bubble.jpeg ou spécifier votre propre image à la place. Envoyez la requête en sélectionnant Exécuter.

Image avant recadrage
Crédit image : Yasmin Dangor sur Unsplash.