Detectar escrita à mão (OCR)

Reconhecimento ótico de caracteres (OCR)

A detecção e extração de textos de imagens pode ser feita com a API Vision.

  • DOCUMENT_TEXT_DETECTION extrai texto de uma imagem e a resposta é otimizada para texto e documentos densos. Com o JSON, são incluídas informações de página, bloco, parágrafo, palavra e quebra de linha.

Um dos usos específicos de DOCUMENT_TEXT_DETECTION é para detectar o escrita à mão em uma imagem.

Amostras de código

Para ver amostras em várias linguagens de programação, consulte:

Solicitações de detecção de texto de documento

Configurar projeto e autenticação do GCP

Detectar escrita à mão

É possível detectar texto escrito à mão em uma imagem passando o caminho de arquivo da imagem ou o URL público para a API do Cloud Vision.

Comando curl

Para fazer uma solicitação de detecção de escrita à mão usando o curl na linha de comando do Linux ou do MacOS, faça uma solicitação POST para o endpoint https://vision.googleapis.com/v1/images:annotate e especifique DOCUMENT_TEXT_DETECTION como o valor de features.type, conforme exemplo a seguir:

curl -X POST \
     -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
     -H "Content-Type: application/json; charset=utf-8" \
     --data "{
      'requests': [
        {
          'image': {
            'source': {
              'imageUri': 'gs://vision-api-handwriting-ocr-bucket/handwriting_image.png'
            }
          },
          'features': [
            {
              'type': 'DOCUMENT_TEXT_DETECTION'
            }
          ]
        }
      ]
    }" "https://vision.googleapis.com/v1/images:annotate"

É possível transmitir as imagens de uma destas três maneiras: como uma string codificada em base64 (mostrada acima), como URI do Google Cloud Storage ou da Web. Para saber mais, consulte Como fazer solicitações.

Para mais informações sobre como configurar o corpo da solicitação, consulte a documentação de referência de AnnotateImageRequest.

COMANDO GCLOUD

Para realizar a análise de entidade, use o comando gcloud ml vision detect-document, conforme exemplo a seguir:

gcloud ml vision detect-document "gs://vision-api-handwriting-ocr-bucket/handwriting_image.png"

PowerShell

Para fazer uma solicitação de detecção de escrita à mão usando o Windows PowerShell, faça uma solicitação POST para o endpoint https://vision.googleapis.com/v1/images:annotate e especifique DOCUMENT_TEXT_DETECTION como o valor de features.type, conforme exemplo a seguir:

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

Invoke-WebRequest `
  -Method Post `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body "{
      'requests': [
        {
          'image': {
            'source': {
              'imageUri': 'gs://vision-api-handwriting-ocr-bucket/handwriting_image.png'
            }
          },
          'features': [
            {
              'type': 'DOCUMENT_TEXT_DETECTION'
            }
          ]
        }
      ]
    }" `
  -Uri "https://vision.googleapis.com/v1/images:annotate" | Select-Object -Expand Content

É possível transmitir as imagens de uma destas três maneiras: como uma string codificada em base64, como URI do Google Cloud Storage ou como URL HTTPS ou HTTP com acesso público. Para saber mais, consulte Como fazer solicitações.

Para mais informações sobre como configurar o corpo da solicitação, consulte a documentação de referência de AnnotateImageRequest.

Resposta de detecção de texto de documento

Uma resposta de DOCUMENT_TEXT_DETECTION inclui outras informações de layout, como página, bloco, parágrafo, palavra e quebra de linha, além de pontuações de confiança para cada uma. A amostra abaixo usa um exemplo simplificado. A resposta de um documento denso é muito longa para ser exibida nesta página.

{
  "responses": [
    {
      "textAnnotations": [
        {
          "locale": "en",
          "description": "Google Cloud\nPlatform\n",
          "boundingPoly": {
            "vertices": [
              {
                "x": 312,
                "y": 95
              },
              {
                "x": 694,
                "y": 95
              },
              {
                "x": 694,
                "y": 253
              },
              {
                "x": 312,
                "y": 253
              }
            ]
          }
        },
        {
          "description": "Google",
          "boundingPoly": {
            "vertices": [
              {
                "x": 312,
                "y": 103
              },
              {
                "x": 530,
                "y": 99
              },
              {
                "x": 531,
                "y": 172
              },
              {
                "x": 313,
                "y": 176
              }
            ]
          }
        },
        {
          "description": "Cloud",
          "boundingPoly": {
            "vertices": [
              {
                "x": 602,
                "y": 97
              },
              {
                "x": 693,
                "y": 95
              },
              {
                "x": 694,
                "y": 168
              },
              {
                "x": 603,
                "y": 170
              }
            ]
          }
        },
        {
          "description": "Platform",
          "boundingPoly": {
            "vertices": [
              {
                "x": 429,
                "y": 190
              },
              {
                "x": 582,
                "y": 190
              },
              {
                "x": 582,
                "y": 253
              },
              {
                "x": 429,
                "y": 253
              }
            ]
          }
        }
      ],
      "fullTextAnnotation": {
        "pages": [
          {
            "property": {
              "detectedLanguages": [
                {
                  "languageCode": "en",
                  "confidence": 1
                }
              ]
            },
            "width": 850,
            "height": 550,
            "blocks": [
              {
                "boundingBox": {
                  "vertices": [
                    {
                      "x": 312,
                      "y": 103
                    },
                    {
                      "x": 693,
                      "y": 95
                    },
                    {
                      "x": 696,
                      "y": 250
                    },
                    {
                      "x": 315,
                      "y": 258
                    }
                  ]
                },
                "paragraphs": [
                  {
                    "boundingBox": {
                      "vertices": [
                        {
                          "x": 312,
                          "y": 103
                        },
                        {
                          "x": 693,
                          "y": 95
                        },
                        {
                          "x": 694,
                          "y": 168
                        },
                        {
                          "x": 313,
                          "y": 176
                        }
                      ]
                    },
                    "words": [
                      {
                        "property": {
                          "detectedLanguages": [
                            {
                              "languageCode": "en"
                            }
                          ]
                        },
                        "boundingBox": {
                          "vertices": [
                            {
                              "x": 312,
                              "y": 103
                            },
                            {
                              "x": 530,
                              "y": 99
                            },
                            {
                              "x": 531,
                              "y": 172
                            },
                            {
                              "x": 313,
                              "y": 176
                            }
                          ]
                        },
                        "symbols": [
                          {
                            "property": {
                              "detectedLanguages": [
                                {
                                  "languageCode": "en"
                                }
                              ]
                            },
                            "boundingBox": {
                              "vertices": [
                                {
                                  "x": 312,
                                  "y": 104
                                },
                                {
                                  "x": 371,
                                  "y": 103
                                },
                                {
                                  "x": 372,
                                  "y": 175
                                },
                                {
                                  "x": 313,
                                  "y": 176
                                }
                              ]
                            },
                            "text": "G",
                            "confidence": 0.99
                          },
                          ...
                        ],
                        "confidence": 0.99
                      },
                      {
                        "property": {
                          "detectedLanguages": [
                            {
                              "languageCode": "en"
                            }
                          ]
                        },
                        "boundingBox": {
                          "vertices": [
                            {
                              "x": 602,
                              "y": 97
                            },
                            {
                              "x": 693,
                              "y": 95
                            },
                            {
                              "x": 694,
                              "y": 168
                            },
                            {
                              "x": 603,
                              "y": 170
                            }
                          ]
                        },
                        "symbols": [
                          {
                            "property": {
                              "detectedLanguages": [
                                {
                                  "languageCode": "en"
                                }
                              ]
                            },
                            "boundingBox": {
                              "vertices": [
                                {
                                  "x": 602,
                                  "y": 98
                                },
                                {
                                  "x": 620,
                                  "y": 98
                                },
                                {
                                  "x": 621,
                                  "y": 170
                                },
                                {
                                  "x": 603,
                                  "y": 170
                                }
                              ]
                            },
                            "text": "C",
                            "confidence": 0.99
                          },
                          ...
                        ],
                        "confidence": 0.99
                      }
                    ],
                    "confidence": 0.99
                  },
                  {
                    "boundingBox": {
                      "vertices": [
                        {
                          "x": 429,
                          "y": 190
                        },
                        {
                          "x": 582,
                          "y": 190
                        },
                        {
                          "x": 582,
                          "y": 253
                        },
                        {
                          "x": 429,
                          "y": 253
                        }
                      ]
                    },
                    "words": [
                      {
                        "property": {
                          "detectedLanguages": [
                            {
                              "languageCode": "en"
                            }
                          ]
                        },
                        "boundingBox": {
                          "vertices": [
                            {
                              "x": 429,
                              "y": 190
                            },
                            {
                              "x": 582,
                              "y": 190
                            },
                            {
                              "x": 582,
                              "y": 253
                            },
                            {
                              "x": 429,
                              "y": 253
                            }
                          ]
                        },
                        "symbols": [
                          {
                            "property": {
                              "detectedLanguages": [
                                {
                                  "languageCode": "en"
                                }
                              ]
                            },
                            "boundingBox": {
                              "vertices": [
                                {
                                  "x": 429,
                                  "y": 190
                                },
                                {
                                  "x": 449,
                                  "y": 190
                                },
                                {
                                  "x": 449,
                                  "y": 253
                                },
                                {
                                  "x": 429,
                                  "y": 253
                                }
                              ]
                            },
                            "text": "P",
                            "confidence": 0.92
                          },
                          ...
                        ],
                        "confidence": 0.97
                      }
                    ],
                    "confidence": 0.97
                  }
                ],
                "blockType": "TEXT",
                "confidence": 0.98
              }
            ]
          }
        ],
        "text": "Google Cloud\nPlatform\n"
      }
    }
  ]
}

Especificar o idioma (opcional)

Ambos os tipos de solicitações do OCR são compatíveis com um ou mais languageHints, com que é especificado o idioma de qualquer texto na imagem. Na maioria dos casos, um valor vazio produz os melhores resultados, porque possibilita a detecção automática do idioma. Não é necessário configurar languageHints para idiomas baseados no alfabeto latino. Em alguns casos, quando o idioma do texto na imagem é conhecido, você recebe resultados melhores definindo uma dica. No entanto, isso pode se tornar um incômodo se você defini-la errado. A detecção de texto retorna um erro se um ou mais dos idiomas especificados não for um idioma compatível.

Testar

Tente as opções de detecção de texto e de detecção de texto de documentos, abaixo. Clique em Executar para usar a imagem especificada (gs://vision-api-handwriting-ocr-bucket/handwriting_image.png) ou especifique sua própria imagem.