Распознавание текста на изображении
Чтобы распознать текст на изображении, вы можете использовать OCR API. OCR API — это обновленный и переработанный интерфейс, который предоставляет больше возможностей, в т.ч. распознавание многоколоночного текста.
Перед началом работы
Чтобы воспользоваться примерами, установите cURL
Получите данные вашего аккаунта для аутентификации:
-
Получите IAM-токен для аккаунта на Яндексе или федеративного аккаунта.
-
Получите идентификатор каталога, на который у вашего аккаунта есть роль
ai.vision.user
или выше. -
При обращении к Vision OCR через API в каждом запросе передавайте полученные параметры:
-
Для Vision API и Classifier API:
Указывайте IAM-токен в заголовке
Authorization
в следующем формате:Authorization: Bearer <IAM-токен>
Идентификатор каталога указывайте в теле запроса в параметре
folderId
. -
Для OCR API:
- в заголовке
Authorization
указывайте IAM-токен; - в заголовке
x-folder-id
указывайте идентификатор каталога.
Authorization: Bearer <IAM-токен> x-folder-id <идентификатор_каталога>
- в заголовке
-
Vision OCR поддерживает два способа аутентификации с сервисным аккаунтом:
-
С помощью IAM-токена:
-
Полученный IAM-токен передавайте в заголовке
Authorization
в следующем формате:Authorization: Bearer <IAM-токен>
-
С помощью API-ключей.
Используйте API-ключи, если у вас нет возможности автоматически запрашивать IAM-токен.
-
Полученный API-ключ передавайте в заголовке
Authorization
в следующем формате:Authorization: Api-Key <API-ключ>
Не указывайте в запросах идентификатор каталога — сервис использует каталог, в котором был создан сервисный аккаунт.
Распознать текст на изображении с помощью OCR API
Распознавание текста на изображении реализовано в методе recognize OCR API.
-
Подготовьте файл изображения, соответствующий требованиям:
- Поддерживаемые форматы файлов: JPEG, PNG, PDF. MIME-тип
файла указывайте в свойствеmime_type
. По умолчаниюimage
. - Максимальный размер файла: 10 МБ.
- Размер изображения не должен превышать 20 мегапикселей (длина × ширина).
Примечание
Нужен пример изображения? Скачайте изображение дорожного знака, предупреждающего о пингвинах
. - Поддерживаемые форматы файлов: JPEG, PNG, PDF. MIME-тип
-
Кодируйте файл с изображением в формат Base64:
UNIXWindowsPowerShellPythonNode.jsJavaGobase64 -i input.jpg > output.txt
C:> Base64.exe -e input.jpg > output.txt
[Convert]::ToBase64String([IO.File]::ReadAllBytes("./input.jpg")) > output.txt
# Импортируйте библиотеку для кодирования в Base64 import base64 # Создайте функцию, которая кодирует файл и возвращает результат. def encode_file(file_path): with open(file_path, "rb") as fid: file_content = fid.read() return base64.b64encode(file_content).decode("utf-8")
// Считайте содержимое файла в память. var fs = require('fs'); var file = fs.readFileSync('/path/to/file'); // Получите содержимое файла в формате Base64. var encoded = Buffer.from(file).toString('base64');
// Импортируйте библиотеку для кодирования в Base64. import org.apache.commons.codec.binary.Base64; // Получите содержимое файла в формате Base64. byte[] fileData = Base64.encodeBase64(yourFile.getBytes());
import ( "bufio" "encoding/base64" "io/ioutil" "os" ) // Откройте файл f, _ := os.Open("/path/to/file") // Прочитайте содержимое файла. reader := bufio.NewReader(f) content, _ := ioutil.ReadAll(reader) // Получите содержимое файла в формате Base64. base64.StdEncoding.EncodeToString(content)
-
Создайте файл с телом запроса, например
body.json
.body.json:
{ "mimeType": "JPEG", "languageCodes": ["*"], "model": "page", "content": "<изображение_в_кодировке_base64>" }
В свойстве
content
укажите содержимое файла, полученное при переводе изображения в формат Base64.Чтобы сервис автоматически определил язык текста, укажите в конфигурации свойство
"languageCodes": ["*"]
. -
UNIXPython
export IAM_TOKEN=<IAM-токен> curl \ --request POST \ --header "Content-Type: application/json" \ --header "Authorization: Bearer ${IAM_TOKEN}" \ --header "x-folder-id: <идентификатор_каталога>" \ --header "x-data-logging-enabled: true" \ --data "@body.json" \ https://ocr.api.cloud.yandex.net/ocr/v1/recognizeText \ --output output.json
Где:
<IAM-токен>
— полученный ранее IAM-токен.<идентификатор_каталога>
— полученный ранее идентификатор каталога.
data = {"mimeType": <mime_type>, "languageCodes": ["*"], "content": content} url = "https://ocr.api.cloud.yandex.net/ocr/v1/recognizeText" headers= {"Content-Type": "application/json", "Authorization": "Bearer {:s}".format(<IAM-токен>), "x-folder-id": "<идентификатор_каталога>", "x-data-logging-enabled": "true"} w = requests.post(url=url, headers=headers, data=json.dumps(data))
Результат будет состоять из распознанных блоков текста, строк и слов с указанием их местоположения на изображении:
{ "result": { "text_annotation": { "width": "1920", "height": "1280", "blocks": [{ "bounding_box": { "vertices": [{ "x": "460", "y": "777" }, { "x": "460", "y": "906" }, { "x": "810", "y": "906" }, { "x": "810", "y": "777" }] }, "lines": [{ "bounding_box": { "vertices": [{ "x": "460", "y": "777" }, { "x": "460", "y": "820" }, { "x": "802", "y": "820" }, { "x": "802", "y": "777" }] }, "alternatives": [{ "text": "PENGUINS", "words": [{ "bounding_box": { "vertices": [{ "x": "460", "y": "768" }, { "x": "460", "y": "830" }, { "x": "802", "y": "830" }, { "x": "802", "y": "768" }] }, "text": "PENGUINS", "entity_index": "-1" }] }] }, { "bounding_box": { "vertices": [{ "x": "489", "y": "861" }, { "x": "489", "y": "906" }, { "x": "810", "y": "906" }, { "x": "810", "y": "861" }] }, "alternatives": [{ "text": "CROSSING", "words": [{ "bounding_box": { "vertices": [{ "x": "489", "y": "852" }, { "x": "489", "y": "916" }, { "x": "810", "y": "916" }, { "x": "810", "y": "852" }] }, "text": "CROSSING", "entity_index": "-1" }] }] }], "languages": [{ "language_code": "en" }] }, { "bounding_box": { "vertices": [{ "x": "547", "y": "989" }, { "x": "547", "y": "1046" }, { "x": "748", "y": "1046" }, { "x": "748", "y": "989" }] }, "lines": [{ "bounding_box": { "vertices": [{ "x": "547", "y": "989" }, { "x": "547", "y": "1046" }, { "x": "748", "y": "1046" }, { "x": "748", "y": "989" }] }, "alternatives": [{ "text": "SLOW", "words": [{ "bounding_box": { "vertices": [{ "x": "547", "y": "983" }, { "x": "547", "y": "1054" }, { "x": "748", "y": "1054" }, { "x": "748", "y": "983" }] }, "text": "SLOW", "entity_index": "-1" }] }] }], "languages": [{ "language_code": "en" }] }], "entities": [] }, "page": "0" } }
-
Чтобы получить все распознанные на изображении слова, найдите все значения со свойством
text
.
Примечание
Если полученные координаты не соответствуют отображаемому положению элементов, настройте в вашем средстве просмотра изображений поддержку метаданных exif
, либо при передаче в сервис удаляйте из секции exif
изображения атрибут Orientation
.