Распознавание рукописного текста
Чтобы распознать рукописный текст на изображении, вы можете использовать OCR API с моделью распознавания handwritten
. Эта модель позволяет распознавать произвольное сочетание рукописного и печатного текста на русском и английском языках.
Перед началом работы
Чтобы воспользоваться примерами, установите 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-ключ>
Не указывайте в запросах идентификатор каталога — сервис использует каталог, в котором был создан сервисный аккаунт.
Распознать рукописный текст на изображении
Распознавание текста на изображении реализовано в методе 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": ["ru","en"], "model": "handwritten", "content": "<изображение_в_кодировке_base64>" }
В свойстве
content
укажите содержимое файла, полученное при переводе изображения в формат Base64. -
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": { "textAnnotation": { "width": "241", "height": "162", "blocks": [ { "boundingBox": { "vertices": [ { "x": "28", "y": "8" }, { "x": "28", "y": "130" }, { "x": "240", "y": "130" }, { "x": "240", "y": "8" } ] }, "lines": [ { "boundingBox": { "vertices": [ { "x": "28", "y": "8" }, { "x": "28", "y": "77" }, { "x": "240", "y": "77" }, { "x": "240", "y": "8" } ] }, "text": "Привет,", "words": [ { "boundingBox": { "vertices": [ { "x": "28", "y": "9" }, { "x": "28", "y": "81" }, { "x": "240", "y": "81" }, { "x": "240", "y": "9" } ] }, "text": "Привет,", "entityIndex": "-1", "textSegments": [ { "startIndex": "0", "length": "7" } ] } ], "textSegments": [ { "startIndex": "0", "length": "7" } ] }, { "boundingBox": { "vertices": [ { "x": "112", "y": "94" }, { "x": "112", "y": "130" }, { "x": "240", "y": "130" }, { "x": "240", "y": "94" } ] }, "text": "Мир!", "words": [ { "boundingBox": { "vertices": [ { "x": "112", "y": "89" }, { "x": "112", "y": "137" }, { "x": "240", "y": "137" }, { "x": "240", "y": "89" } ] }, "text": "Мир!", "entityIndex": "-1", "textSegments": [ { "startIndex": "8", "length": "4" } ] } ], "textSegments": [ { "startIndex": "8", "length": "4" } ] } ], "languages": [ { "languageCode": "ru" } ], "textSegments": [ { "startIndex": "0", "length": "12" } ] } ], "entities": [], "tables": [], "fullText": "Привет,\nМир!\n" }, "page": "0" } }
-
Чтобы получить все распознанные на изображении слова, найдите все значения со свойством
text
.
Примечание
Если полученные координаты не соответствуют отображаемому положению элементов, настройте в вашем средстве просмотра изображений поддержку метаданных exif
, либо при передаче в сервис удаляйте из секции exif
изображения атрибут Orientation
.