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á.
Detectar texto em um vídeo armazenado
A detecção de texto em vídeos armazenados pelo Amazon Rekognition Video é uma operação assíncrona. Para começar a detectar texto, ligue StartTextDetection. O Amazon Rekognition Video publica o status de conclusão da análise de vídeo em um tópico do Amazon SNS. Se a análise do vídeo for bem-sucedida, ligue GetTextDetectionpara obter os resultados da análise. Para obter mais informações sobre como iniciar uma análise de vídeo e obter os resultados, consulte Chamando as operações de vídeo do Amazon Rekognition Video.
Esse procedimento expande o código em Análise de um vídeo armazenado em um bucket do Amazon S3 com Java ou Python () SDK. Ele usa uma fila do Amazon SQS para obter o status de conclusão de uma solicitação de análise de vídeo.
Para detectar texto em um vídeo armazenado em um bucket do Amazon S3 (SDK)
-
Siga as etapas em Análise de um vídeo armazenado em um bucket do Amazon S3 com Java ou Python () SDK.
-
Adicione o código a seguir à classe VideoDetect
na etapa 1.
- Java
-
//Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.)
private static void StartTextDetection(String bucket, String video) throws Exception{
NotificationChannel channel= new NotificationChannel()
.withSNSTopicArn(snsTopicArn)
.withRoleArn(roleArn);
StartTextDetectionRequest req = new StartTextDetectionRequest()
.withVideo(new Video()
.withS3Object(new S3Object()
.withBucket(bucket)
.withName(video)))
.withNotificationChannel(channel);
StartTextDetectionResult startTextDetectionResult = rek.startTextDetection(req);
startJobId=startTextDetectionResult.getJobId();
}
private static void GetTextDetectionResults() throws Exception{
int maxResults=10;
String paginationToken=null;
GetTextDetectionResult textDetectionResult=null;
do{
if (textDetectionResult !=null){
paginationToken = textDetectionResult.getNextToken();
}
textDetectionResult = rek.getTextDetection(new GetTextDetectionRequest()
.withJobId(startJobId)
.withNextToken(paginationToken)
.withMaxResults(maxResults));
VideoMetadata videoMetaData=textDetectionResult.getVideoMetadata();
System.out.println("Format: " + videoMetaData.getFormat());
System.out.println("Codec: " + videoMetaData.getCodec());
System.out.println("Duration: " + videoMetaData.getDurationMillis());
System.out.println("FrameRate: " + videoMetaData.getFrameRate());
//Show text, confidence values
List<TextDetectionResult> textDetections = textDetectionResult.getTextDetections();
for (TextDetectionResult text: textDetections) {
long seconds=text.getTimestamp()/1000;
System.out.println("Sec: " + Long.toString(seconds) + " ");
TextDetection detectedText=text.getTextDetection();
System.out.println("Text Detected: " + detectedText.getDetectedText());
System.out.println("Confidence: " + detectedText.getConfidence().toString());
System.out.println("Id : " + detectedText.getId());
System.out.println("Parent Id: " + detectedText.getParentId());
System.out.println("Bounding Box" + detectedText.getGeometry().getBoundingBox().toString());
System.out.println("Type: " + detectedText.getType());
System.out.println();
}
} while (textDetectionResult !=null && textDetectionResult.getNextToken() != null);
}
Na função main
, substitua as linhas:
StartLabelDetection(bucket, video);
if (GetSQSMessageSuccess()==true)
GetLabelDetectionResults();
por:
StartTextDetection(bucket, video);
if (GetSQSMessageSuccess()==true)
GetTextDetectionResults();
- Java V2
-
Esse código foi retirado do GitHub repositório de exemplos do SDK de AWS documentação. Veja o exemplo completo aqui.
//snippet-start:[rekognition.java2.recognize_video_text.import]
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rekognition.RekognitionClient;
import software.amazon.awssdk.services.rekognition.model.S3Object;
import software.amazon.awssdk.services.rekognition.model.NotificationChannel;
import software.amazon.awssdk.services.rekognition.model.Video;
import software.amazon.awssdk.services.rekognition.model.StartTextDetectionRequest;
import software.amazon.awssdk.services.rekognition.model.StartTextDetectionResponse;
import software.amazon.awssdk.services.rekognition.model.RekognitionException;
import software.amazon.awssdk.services.rekognition.model.GetTextDetectionResponse;
import software.amazon.awssdk.services.rekognition.model.GetTextDetectionRequest;
import software.amazon.awssdk.services.rekognition.model.VideoMetadata;
import software.amazon.awssdk.services.rekognition.model.TextDetectionResult;
import java.util.List;
//snippet-end:[rekognition.java2.recognize_video_text.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 DetectTextVideo {
private static String startJobId ="";
public static void main(String[] args) {
final String usage = "\n" +
"Usage: " +
" <bucket> <video> <topicArn> <roleArn>\n\n" +
"Where:\n" +
" bucket - The name of the bucket in which the video is located (for example, (for example, myBucket). \n\n"+
" video - The name of video (for example, people.mp4). \n\n" +
" topicArn - The ARN of the Amazon Simple Notification Service (Amazon SNS) topic. \n\n" +
" roleArn - The ARN of the AWS Identity and Access Management (IAM) role to use. \n\n" ;
if (args.length != 4) {
System.out.println(usage);
System.exit(1);
}
String bucket = args[0];
String video = args[1];
String topicArn = args[2];
String roleArn = args[3];
Region region = Region.US_EAST_1;
RekognitionClient rekClient = RekognitionClient.builder()
.region(region)
.credentialsProvider(ProfileCredentialsProvider.create("profile-name"))
.build();
NotificationChannel channel = NotificationChannel.builder()
.snsTopicArn(topicArn)
.roleArn(roleArn)
.build();
startTextLabels(rekClient, channel, bucket, video);
GetTextResults(rekClient);
System.out.println("This example is done!");
rekClient.close();
}
// snippet-start:[rekognition.java2.recognize_video_text.main]
public static void startTextLabels(RekognitionClient rekClient,
NotificationChannel channel,
String bucket,
String video) {
try {
S3Object s3Obj = S3Object.builder()
.bucket(bucket)
.name(video)
.build();
Video vidOb = Video.builder()
.s3Object(s3Obj)
.build();
StartTextDetectionRequest labelDetectionRequest = StartTextDetectionRequest.builder()
.jobTag("DetectingLabels")
.notificationChannel(channel)
.video(vidOb)
.build();
StartTextDetectionResponse labelDetectionResponse = rekClient.startTextDetection(labelDetectionRequest);
startJobId = labelDetectionResponse.jobId();
} catch (RekognitionException e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
public static void GetTextResults(RekognitionClient rekClient) {
try {
String paginationToken=null;
GetTextDetectionResponse textDetectionResponse=null;
boolean finished = false;
String status;
int yy=0 ;
do{
if (textDetectionResponse !=null)
paginationToken = textDetectionResponse.nextToken();
GetTextDetectionRequest recognitionRequest = GetTextDetectionRequest.builder()
.jobId(startJobId)
.nextToken(paginationToken)
.maxResults(10)
.build();
// Wait until the job succeeds.
while (!finished) {
textDetectionResponse = rekClient.getTextDetection(recognitionRequest);
status = textDetectionResponse.jobStatusAsString();
if (status.compareTo("SUCCEEDED") == 0)
finished = true;
else {
System.out.println(yy + " status is: " + status);
Thread.sleep(1000);
}
yy++;
}
finished = false;
// Proceed when the job is done - otherwise VideoMetadata is null.
VideoMetadata videoMetaData=textDetectionResponse.videoMetadata();
System.out.println("Format: " + videoMetaData.format());
System.out.println("Codec: " + videoMetaData.codec());
System.out.println("Duration: " + videoMetaData.durationMillis());
System.out.println("FrameRate: " + videoMetaData.frameRate());
System.out.println("Job");
List<TextDetectionResult> labels= textDetectionResponse.textDetections();
for (TextDetectionResult detectedText: labels) {
System.out.println("Confidence: " + detectedText.textDetection().confidence().toString());
System.out.println("Id : " + detectedText.textDetection().id());
System.out.println("Parent Id: " + detectedText.textDetection().parentId());
System.out.println("Type: " + detectedText.textDetection().type());
System.out.println("Text: " + detectedText.textDetection().detectedText());
System.out.println();
}
} while (textDetectionResponse !=null && textDetectionResponse.nextToken() != null);
} catch(RekognitionException | InterruptedException e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
// snippet-end:[rekognition.java2.recognize_video_text.main]
}
- Python
-
#Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.)
def StartTextDetection(self):
response=self.rek.start_text_detection(Video={'S3Object': {'Bucket': self.bucket, 'Name': self.video}},
NotificationChannel={'RoleArn': self.roleArn, 'SNSTopicArn': self.snsTopicArn})
self.startJobId=response['JobId']
print('Start Job Id: ' + self.startJobId)
def GetTextDetectionResults(self):
maxResults = 10
paginationToken = ''
finished = False
while finished == False:
response = self.rek.get_text_detection(JobId=self.startJobId,
MaxResults=maxResults,
NextToken=paginationToken)
print('Codec: ' + response['VideoMetadata']['Codec'])
print('Duration: ' + str(response['VideoMetadata']['DurationMillis']))
print('Format: ' + response['VideoMetadata']['Format'])
print('Frame rate: ' + str(response['VideoMetadata']['FrameRate']))
print()
for textDetection in response['TextDetections']:
text=textDetection['TextDetection']
print("Timestamp: " + str(textDetection['Timestamp']))
print(" Text Detected: " + text['DetectedText'])
print(" Confidence: " + str(text['Confidence']))
print (" Bounding box")
print (" Top: " + str(text['Geometry']['BoundingBox']['Top']))
print (" Left: " + str(text['Geometry']['BoundingBox']['Left']))
print (" Width: " + str(text['Geometry']['BoundingBox']['Width']))
print (" Height: " + str(text['Geometry']['BoundingBox']['Height']))
print (" Type: " + str(text['Type']) )
print()
if 'NextToken' in response:
paginationToken = response['NextToken']
else:
finished = True
Na função main
, substitua as linhas:
analyzer.StartLabelDetection()
if analyzer.GetSQSMessageSuccess()==True:
analyzer.GetLabelDetectionResults()
por:
analyzer.StartTextDetection()
if analyzer.GetSQSMessageSuccess()==True:
analyzer.GetTextDetectionResults()
- CLI
-
Execute o AWS CLI comando a seguir para começar a detectar texto em um vídeo.
aws rekognition start-text-detection --video "{"S3Object":{"Bucket":"bucket-name","Name":"video-name"}}"\
--notification-channel "{"SNSTopicArn":"topic-arn","RoleArn":"role-arn"}" \
--region region-name --profile profile-name
Atualize os seguintes valores:
-
Mude bucket-name
e video-name
para o nome do bucket do Amazon S3 e o nome do arquivo que você especificou na etapa 2.
-
Altere region-name
para a região da AWS que você está usando.
-
Substitua o valor de profile-name
com o nome do seu perfil de desenvolvedor.
-
Mude topic-ARN
para o ARN do tópico do Amazon SNS que você criou na etapa 3 do Configuração do Amazon Rekognition Video.
-
Mude role-ARN
para o ARN do perfil de serviço do IAM que você criou na etapa 7 do Configuração do Amazon Rekognition Video.
Se você estiver acessando a CLI em um dispositivo Windows, use aspas duplas em vez de aspas simples e escape das aspas duplas internas com barra invertida (ou seja, \) para resolver quaisquer erros de analisador que você possa encontrar. Para ver um exemplo, veja abaixo:
aws rekognition start-text-detection --video \
"{\"S3Object\":{\"Bucket\":\"bucket-name\",\"Name\":\"video-name\"}}" \
--notification-channel "{\"SNSTopicArn\":\"topic-arn\",\"RoleArn\":\"role-arn\"}" \
--region region-name --profile profile-name
Depois de executar o exemplo do código de procedimento, copie o jobID
retornado e forneça-o ao seguinte comando GetTextDetection
abaixo para obter seus resultados, substitua job-id-number
pelo jobID
que você recebeu anteriormente:
aws rekognition get-text-detection --job-id job-id-number --profile profile-name
-
Execute o código. O texto detectado no vídeo é mostrado em uma lista.
Filtros
Os filtros são parâmetros de solicitação opcionais que podem ser usados ao chamar StartTextDetection
. A filtragem do texto por região, tamanho e pontuação de confiança oferece flexibilidade adicional para controlar a saída de detecção de seu texto. Usando regiões de interesse, é possível limitar facilmente a detecção de texto a regiões que sejam relevantes para você. Por exemplo, uma região no terço inferior referente a elementos gráficos ou um canto superior esquerdo para ler placares em um jogo de futebol. O filtro de tamanho da caixa delimitadora de palavras pode ser usado para evitar texto pequeno em segundo plano que pode ser ruído ou irrelevante. Por fim, o filtro de confiança de palavras permite remover resultados que podem não ser confiáveis por estarem borrados ou manchados.
Para obter informações sobre valores de filtro, consulte DetectTextFilters
.
É possível usar os seguintes filtros:
-
MinConfidence—Define o nível de confiança da detecção de palavras. Palavras com confiança de detecção abaixo desse nível são excluídas do resultado. Os valores devem estar entre 0 e 100.
-
MinBoundingBoxWidth— Define a largura mínima da caixa delimitadora da palavra. Palavras com caixas delimitadoras menores que esse valor são excluídas do resultado. O valor é relativo à largura do quadro de vídeo.
-
MinBoundingBoxHeight— Define a altura mínima da caixa delimitadora da palavra. Palavras com alturas de caixa delimitadora menores que este valor são excluídas do resultado. O valor é relativo à altura do quadro de vídeo.
-
RegionsOfInterest— Limita a detecção a uma região específica do quadro. Os valores são relativos às dimensões do quadro. Para objetos apenas parcialmente dentro das regiões, a resposta é indefinida.
GetTextDetection resposta
GetTextDetection
retorna uma matriz (TextDetectionResults
) que contém informações sobre as faces detectadas no vídeo. Existe um elemento da matriz, TextDetection, para cada vez que uma palavra ou linha é detectada no vídeo. Os elementos da matriz são classificados por tempo, em milissegundos desde o início do vídeo.
O exemplo a seguir é a resposta parcial do JSON de GetTextDetection
. Na resposta, observe o seguinte:
-
Informações de texto — O elemento da TextDetectionResult
matriz contém informações sobre o texto detectado (TextDetection) e a hora em que o texto foi detectado no vídeo (Timestamp
).
-
Informações de paginação: o exemplo mostra uma página de informações de detecção de texto. É possível especificar quantos elementos de texto retornar no parâmetro de entrada MaxResults
para GetTextDetection
. Se houver mais resultados do que MaxResults
ou se houver mais resultados do que o máximo padrão, GetTextDetection
retornará um token (NextToken
) que será usado para obter a próxima página de resultados. Para ter mais informações, consulte Obter os resultados da análise do Amazon Rekognition Video.
-
Informações de vídeo – A resposta inclui informações sobre o formato do vídeo (VideoMetadata
) em cada página de informações retornada pelo GetTextDetection
.
{
"JobStatus": "SUCCEEDED",
"VideoMetadata": {
"Codec": "h264",
"DurationMillis": 174441,
"Format": "QuickTime / MOV",
"FrameRate": 29.970029830932617,
"FrameHeight": 480,
"FrameWidth": 854
},
"TextDetections": [
{
"Timestamp": 967,
"TextDetection": {
"DetectedText": "Twinkle Twinkle Little Star",
"Type": "LINE",
"Id": 0,
"Confidence": 99.91780090332031,
"Geometry": {
"BoundingBox": {
"Width": 0.8337579369544983,
"Height": 0.08365312218666077,
"Left": 0.08313830941915512,
"Top": 0.4663468301296234
},
"Polygon": [
{
"X": 0.08313830941915512,
"Y": 0.4663468301296234
},
{
"X": 0.9168962240219116,
"Y": 0.4674469828605652
},
{
"X": 0.916861355304718,
"Y": 0.5511001348495483
},
{
"X": 0.08310343325138092,
"Y": 0.5499999523162842
}
]
}
}
},
{
"Timestamp": 967,
"TextDetection": {
"DetectedText": "Twinkle",
"Type": "WORD",
"Id": 1,
"ParentId": 0,
"Confidence": 99.98338317871094,
"Geometry": {
"BoundingBox": {
"Width": 0.2423887550830841,
"Height": 0.0833333358168602,
"Left": 0.08313817530870438,
"Top": 0.46666666865348816
},
"Polygon": [
{
"X": 0.08313817530870438,
"Y": 0.46666666865348816
},
{
"X": 0.3255269229412079,
"Y": 0.46666666865348816
},
{
"X": 0.3255269229412079,
"Y": 0.550000011920929
},
{
"X": 0.08313817530870438,
"Y": 0.550000011920929
}
]
}
}
},
{
"Timestamp": 967,
"TextDetection": {
"DetectedText": "Twinkle",
"Type": "WORD",
"Id": 2,
"ParentId": 0,
"Confidence": 99.982666015625,
"Geometry": {
"BoundingBox": {
"Width": 0.2423887550830841,
"Height": 0.08124999701976776,
"Left": 0.3454332649707794,
"Top": 0.46875
},
"Polygon": [
{
"X": 0.3454332649707794,
"Y": 0.46875
},
{
"X": 0.5878220200538635,
"Y": 0.46875
},
{
"X": 0.5878220200538635,
"Y": 0.550000011920929
},
{
"X": 0.3454332649707794,
"Y": 0.550000011920929
}
]
}
}
},
{
"Timestamp": 967,
"TextDetection": {
"DetectedText": "Little",
"Type": "WORD",
"Id": 3,
"ParentId": 0,
"Confidence": 99.8787612915039,
"Geometry": {
"BoundingBox": {
"Width": 0.16627635061740875,
"Height": 0.08124999701976776,
"Left": 0.6053864359855652,
"Top": 0.46875
},
"Polygon": [
{
"X": 0.6053864359855652,
"Y": 0.46875
},
{
"X": 0.7716627717018127,
"Y": 0.46875
},
{
"X": 0.7716627717018127,
"Y": 0.550000011920929
},
{
"X": 0.6053864359855652,
"Y": 0.550000011920929
}
]
}
}
},
{
"Timestamp": 967,
"TextDetection": {
"DetectedText": "Star",
"Type": "WORD",
"Id": 4,
"ParentId": 0,
"Confidence": 99.82640075683594,
"Geometry": {
"BoundingBox": {
"Width": 0.12997658550739288,
"Height": 0.08124999701976776,
"Left": 0.7868852615356445,
"Top": 0.46875
},
"Polygon": [
{
"X": 0.7868852615356445,
"Y": 0.46875
},
{
"X": 0.9168618321418762,
"Y": 0.46875
},
{
"X": 0.9168618321418762,
"Y": 0.550000011920929
},
{
"X": 0.7868852615356445,
"Y": 0.550000011920929
}
]
}
}
}
],
"NextToken": "NiHpGbZFnkM/S8kLcukMni15wb05iKtquu/Mwc+Qg1LVlMjjKNOD0Z0GusSPg7TONLe+OZ3P",
"TextModelVersion": "3.0"
}