As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Exibir caixas delimitadoras
As operações do Amazon Rekognition Image podem retornar as coordenadas das caixas delimitadoras para os itens que são detectados em imagens. Por exemplo, a DetectFacesoperação retorna uma caixa delimitadora (BoundingBox) para cada face detectada em uma imagem. Você pode usar as coordenadas da caixa delimitadora para exibir uma caixa em torno de itens detectados. Por exemplo, a imagem a seguir mostra uma caixa delimitadora em torno de uma face.
Uma BoundingBox
tem as seguintes propriedades:
-
Altura: a altura da caixa delimitadora como uma proporção da altura total da imagem.
-
Esquerda: a coordenada esquerda da caixa delimitadora como uma proporção da largura total da imagem.
-
Superior: a coordenada superior da caixa delimitadora como uma proporção da altura total da imagem.
-
Largura: a largura da caixa delimitadora como uma proporção da largura total da imagem.
Cada BoundingBox propriedade tem um valor entre 0 e 1. Cada valor de propriedade é uma proporção da largura (Left
e Width
) ou da altura (Height
e Top
) da imagem total. Por exemplo, se a imagem de entrada tiver 700 x 200 pixels e a coordenada superior esquerda da caixa delimitadora tiver 350 x 50 pixels, a API retornará um valor Left
de 0,5 (350/700) e um valor Top
de 0,25 (50/200).
O diagrama a seguir mostra a faixa de uma imagem que cada propriedade da caixa delimitadora abrange.
Para exibir a caixa delimitadora com a localização e o tamanho corretos, você precisa multiplicar os BoundingBox valores pela largura ou altura da imagem (dependendo do valor desejado) para obter os valores de pixels. Você pode usar os valores de pixel para exibir a caixa delimitadora. Por exemplo, as dimensões em pixels da imagem anterior são 608 de largura x 588 de altura. Os valores da caixa delimitadora para a face são:
BoundingBox.Left: 0.3922065
BoundingBox.Top: 0.15567766
BoundingBox.Width: 0.284666
BoundingBox.Height: 0.2930403
A localização da caixa delimitadora da face em pixels é calculada da seguinte forma:
Left coordinate = BoundingBox.Left (0.3922065) * image width (608) =
238
Top coordinate = BoundingBox.Top (0.15567766) * image height (588) =
91
Face width = BoundingBox.Width (0.284666) * image width (608) =
173
Face height = BoundingBox.Height (0.2930403) * image height (588) =
172
Você pode usar esses valores para exibir uma caixa delimitadora em torno da face.
Uma imagem pode ter várias formas de orientação. Seu aplicativo pode precisar girar a imagem para exibi-la com a orientação correta. As coordenadas da caixa delimitadora são afetadas pela orientação da imagem. Pode ser necessário converter as coordenadas antes que você possa exibir uma caixa delimitadora no local correto. Para ter mais informações, consulte Obter a orientação e as coordenadas da caixa delimitadora da imagem.
Os exemplos a seguir mostram como exibir uma caixa delimitadora ao redor das faces que são detectadas pela chamada. DetectFaces Os exemplos pressupõem que a orientação das imagens é de 0 graus. Os exemplos também mostram como fazer download da imagem de um bucket do Amazon S3.
Para exibir uma caixa delimitadora
-
Se ainda não tiver feito isso:
-
Crie ou atualize um usuário com permissões AmazonRekognitionFullAccess
e AmazonS3ReadOnlyAccess
. Para ter mais informações, consulte Etapa 1: configurar uma AWS conta e criar um usuário.
-
Instale e configure o AWS CLI e os AWS SDKs. Para ter mais informações, consulte Etapa 2: configurar o AWS CLI e AWS SDKs.
-
Use os exemplos a seguir para chamar a operação DetectFaces
.
- Java
-
Altere o valor de bucket
para o bucket do Amazon S3 que contém o arquivo de imagem. Altere o valor de photo
para o nome de arquivo de um arquivo de imagem (formato .jpg ou .png).
//Loads images, detects faces and draws bounding boxes.Determines exif orientation, if necessary.
package com.amazonaws.samples;
//Import the basic graphics classes.
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.*;
import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder;
import com.amazonaws.services.rekognition.model.BoundingBox;
import com.amazonaws.services.rekognition.model.DetectFacesRequest;
import com.amazonaws.services.rekognition.model.DetectFacesResult;
import com.amazonaws.services.rekognition.model.FaceDetail;
import com.amazonaws.services.rekognition.model.Image;
import com.amazonaws.services.rekognition.model.S3Object;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.S3ObjectInputStream;
// Calls DetectFaces and displays a bounding box around each detected image.
public class DisplayFaces extends JPanel {
private static final long serialVersionUID = 1L;
BufferedImage image;
static int scale;
DetectFacesResult result;
public DisplayFaces(DetectFacesResult facesResult, BufferedImage bufImage) throws Exception {
super();
scale = 1; // increase to shrink image size.
result = facesResult;
image = bufImage;
}
// Draws the bounding box around the detected faces.
public void paintComponent(Graphics g) {
float left = 0;
float top = 0;
int height = image.getHeight(this);
int width = image.getWidth(this);
Graphics2D g2d = (Graphics2D) g; // Create a Java2D version of g.
// Draw the image.
g2d.drawImage(image, 0, 0, width / scale, height / scale, this);
g2d.setColor(new Color(0, 212, 0));
// Iterate through faces and display bounding boxes.
List<FaceDetail> faceDetails = result.getFaceDetails();
for (FaceDetail face : faceDetails) {
BoundingBox box = face.getBoundingBox();
left = width * box.getLeft();
top = height * box.getTop();
g2d.drawRect(Math.round(left / scale), Math.round(top / scale),
Math.round((width * box.getWidth()) / scale), Math.round((height * box.getHeight())) / scale);
}
}
public static void main(String arg[]) throws Exception {
String photo = "photo.png";
String bucket = "bucket";
int height = 0;
int width = 0;
// Get the image from an S3 Bucket
AmazonS3 s3client = AmazonS3ClientBuilder.defaultClient();
com.amazonaws.services.s3.model.S3Object s3object = s3client.getObject(bucket, photo);
S3ObjectInputStream inputStream = s3object.getObjectContent();
BufferedImage image = ImageIO.read(inputStream);
DetectFacesRequest request = new DetectFacesRequest()
.withImage(new Image().withS3Object(new S3Object().withName(photo).withBucket(bucket)));
width = image.getWidth();
height = image.getHeight();
// Call DetectFaces
AmazonRekognition amazonRekognition = AmazonRekognitionClientBuilder.defaultClient();
DetectFacesResult result = amazonRekognition.detectFaces(request);
//Show the bounding box info for each face.
List<FaceDetail> faceDetails = result.getFaceDetails();
for (FaceDetail face : faceDetails) {
BoundingBox box = face.getBoundingBox();
float left = width * box.getLeft();
float top = height * box.getTop();
System.out.println("Face:");
System.out.println("Left: " + String.valueOf((int) left));
System.out.println("Top: " + String.valueOf((int) top));
System.out.println("Face Width: " + String.valueOf((int) (width * box.getWidth())));
System.out.println("Face Height: " + String.valueOf((int) (height * box.getHeight())));
System.out.println();
}
// Create frame and panel.
JFrame frame = new JFrame("RotateImage");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DisplayFaces panel = new DisplayFaces(result, image);
panel.setPreferredSize(new Dimension(image.getWidth() / scale, image.getHeight() / scale));
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
}
}
- Python
-
Altere o valor de bucket
para o bucket do Amazon S3 que contém o arquivo de imagem. Altere o valor de photo
para o nome de arquivo de um arquivo de imagem (formato .jpg ou .png). Substitua o valor de profile_name
na linha que cria a sessão do Rekognition pelo nome do seu perfil de desenvolvedor.
import boto3
import io
from PIL import Image, ImageDraw
def show_faces(photo, bucket):
session = boto3.Session(profile_name='profile-name')
client = session.client('rekognition')
# Load image from S3 bucket
s3_connection = boto3.resource('s3')
s3_object = s3_connection.Object(bucket, photo)
s3_response = s3_object.get()
stream = io.BytesIO(s3_response['Body'].read())
image = Image.open(stream)
# Call DetectFaces
response = client.detect_faces(Image={'S3Object': {'Bucket': bucket, 'Name': photo}},
Attributes=['ALL'])
imgWidth, imgHeight = image.size
draw = ImageDraw.Draw(image)
# calculate and display bounding boxes for each detected face
print('Detected faces for ' + photo)
for faceDetail in response['FaceDetails']:
print('The detected face is between ' + str(faceDetail['AgeRange']['Low'])
+ ' and ' + str(faceDetail['AgeRange']['High']) + ' years old')
box = faceDetail['BoundingBox']
left = imgWidth * box['Left']
top = imgHeight * box['Top']
width = imgWidth * box['Width']
height = imgHeight * box['Height']
print('Left: ' + '{0:.0f}'.format(left))
print('Top: ' + '{0:.0f}'.format(top))
print('Face Width: ' + "{0:.0f}".format(width))
print('Face Height: ' + "{0:.0f}".format(height))
points = (
(left, top),
(left + width, top),
(left + width, top + height),
(left, top + height),
(left, top)
)
draw.line(points, fill='#00d400', width=2)
# Alternatively can draw rectangle. However you can't set line width.
# draw.rectangle([left,top, left + width, top + height], outline='#00d400')
image.show()
return len(response['FaceDetails'])
def main():
bucket = "bucket-name"
photo = "photo-name"
faces_count = show_faces(photo, bucket)
print("faces detected: " + str(faces_count))
if __name__ == "__main__":
main()
- Java V2
-
Esse código foi retirado do GitHub repositório de exemplos do SDK de AWS documentação. Veja o exemplo completo aqui.
Observe que s3
se refere ao cliente Amazon S3 do AWS SDK e rekClient
ao cliente Amazon Rekognition do AWS SDK.
//snippet-start:[rekognition.java2.detect_labels.import]
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.*;
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.core.ResponseBytes;
import software.amazon.awssdk.core.SdkBytes;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rekognition.model.Attribute;
import software.amazon.awssdk.services.rekognition.model.BoundingBox;
import software.amazon.awssdk.services.rekognition.model.DetectFacesRequest;
import software.amazon.awssdk.services.rekognition.model.DetectFacesResponse;
import software.amazon.awssdk.services.rekognition.model.FaceDetail;
import software.amazon.awssdk.services.rekognition.model.Image;
import software.amazon.awssdk.services.rekognition.model.RekognitionException;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.rekognition.RekognitionClient;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.model.S3Exception;
//snippet-end:[rekognition.java2.detect_labels.import]
/**
* Before running this Java V2 code example, set up your development environment, including your credentials.
*
* For more information, see the following documentation topic:
*
* https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
*/
public class DisplayFaces extends JPanel {
static DetectFacesResponse result;
static BufferedImage image;
static int scale;
public static void main(String[] args) throws Exception {
final String usage = "\n" +
"Usage: " +
" <sourceImage> <bucketName>\n\n" +
"Where:\n" +
" sourceImage - The name of the image in an Amazon S3 bucket (for example, people.png). \n\n" +
" bucketName - The name of the Amazon S3 bucket (for example, myBucket). \n\n";
if (args.length != 2) {
System.out.println(usage);
System.exit(1);
}
String sourceImage = args[0];
String bucketName = args[1];
Region region = Region.US_EAST_1;
S3Client s3 = S3Client.builder()
.region(region)
.credentialsProvider(ProfileCredentialsProvider.create("profile-name"))
.build();
RekognitionClient rekClient = RekognitionClient.builder()
.region(region)
.credentialsProvider(ProfileCredentialsProvider.create("profile-name"))
.build();
displayAllFaces(s3, rekClient, sourceImage, bucketName);
s3.close();
rekClient.close();
}
// snippet-start:[rekognition.java2.display_faces.main]
public static void displayAllFaces(S3Client s3,
RekognitionClient rekClient,
String sourceImage,
String bucketName) {
int height;
int width;
byte[] data = getObjectBytes (s3, bucketName, sourceImage);
InputStream is = new ByteArrayInputStream(data);
try {
SdkBytes sourceBytes = SdkBytes.fromInputStream(is);
image = ImageIO.read(sourceBytes.asInputStream());
width = image.getWidth();
height = image.getHeight();
// Create an Image object for the source image
software.amazon.awssdk.services.rekognition.model.Image souImage = Image.builder()
.bytes(sourceBytes)
.build();
DetectFacesRequest facesRequest = DetectFacesRequest.builder()
.attributes(Attribute.ALL)
.image(souImage)
.build();
result = rekClient.detectFaces(facesRequest);
// Show the bounding box info for each face.
List<FaceDetail> faceDetails = result.faceDetails();
for (FaceDetail face : faceDetails) {
BoundingBox box = face.boundingBox();
float left = width * box.left();
float top = height * box.top();
System.out.println("Face:");
System.out.println("Left: " + (int) left);
System.out.println("Top: " + (int) top);
System.out.println("Face Width: " + (int) (width * box.width()));
System.out.println("Face Height: " + (int) (height * box.height()));
System.out.println();
}
// Create the frame and panel.
JFrame frame = new JFrame("RotateImage");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DisplayFaces panel = new DisplayFaces(image);
panel.setPreferredSize(new Dimension(image.getWidth() / scale, image.getHeight() / scale));
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
} catch (RekognitionException | FileNotFoundException e) {
System.out.println(e.getMessage());
System.exit(1);
} catch (IOException e) {
e.printStackTrace();
}
}
public static byte[] getObjectBytes (S3Client s3, String bucketName, String keyName) {
try {
GetObjectRequest objectRequest = GetObjectRequest
.builder()
.key(keyName)
.bucket(bucketName)
.build();
ResponseBytes<GetObjectResponse> objectBytes = s3.getObjectAsBytes(objectRequest);
return objectBytes.asByteArray();
} catch (S3Exception e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
}
return null;
}
public DisplayFaces(BufferedImage bufImage) {
super();
scale = 1; // increase to shrink image size.
image = bufImage;
}
// Draws the bounding box around the detected faces.
public void paintComponent(Graphics g) {
float left;
float top;
int height = image.getHeight(this);
int width = image.getWidth(this);
Graphics2D g2d = (Graphics2D) g; // Create a Java2D version of g.
// Draw the image
g2d.drawImage(image, 0, 0, width / scale, height / scale, this);
g2d.setColor(new Color(0, 212, 0));
// Iterate through the faces and display bounding boxes.
List<FaceDetail> faceDetails = result.faceDetails();
for (FaceDetail face : faceDetails) {
BoundingBox box = face.boundingBox();
left = width * box.left();
top = height * box.top();
g2d.drawRect(Math.round(left / scale), Math.round(top / scale),
Math.round((width * box.width()) / scale), Math.round((height * box.height())) / scale);
}
}
// snippet-end:[rekognition.java2.display_faces.main]
}