Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Vision OCR
  • Начало работы
    • Все инструкции
    • Распознавание текста на изображении
    • Распознавание текста из PDF-файла
    • Распознавание рукописного текста
    • Распознавание таблицы
    • Кодирование в Base64
    • Настройка доступа с помощью API-ключа
  • Управление доступом
  • Правила тарификации
  • История изменений
  • Вопросы и ответы

В этой статье:

  • Перед началом работы
  • Распознать рукописный текст на изображении
  1. Пошаговые инструкции
  2. Распознавание рукописного текста

Распознавание рукописного текста

Статья создана
Yandex Cloud
Улучшена
Fedor M.
Обновлена 10 марта 2025 г.
  • Перед началом работы
  • Распознать рукописный текст на изображении

Чтобы распознать рукописный текст на изображении, вы можете использовать OCR API с моделью распознавания handwritten. Эта модель позволяет распознавать произвольное сочетание рукописного и печатного текста на русском и английском языках.

Перед началом работы

Чтобы воспользоваться примерами, установите cURL.

Получите данные вашего аккаунта для аутентификации:

Аккаунт на Яндексе или федеративный аккаунт
Сервисный аккаунт
  1. Получите IAM-токен для аккаунта на Яндексе или федеративного аккаунта.

  2. Получите идентификатор каталога, на который у вашего аккаунта есть роль ai.vision.user или выше.

  3. При обращении к 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-токена:

    1. Получите IAM-токен.

    2. Полученный IAM-токен передавайте в заголовке Authorization в следующем формате:

      Authorization: Bearer <IAM-токен>
      
  • С помощью API-ключей.

    Используйте API-ключи, если у вас нет возможности автоматически запрашивать IAM-токен.

    1. Получите API-ключ.

    2. Полученный API-ключ передавайте в заголовке Authorization в следующем формате:

      Authorization: Api-Key <API-ключ>
      

Не указывайте в запросах идентификатор каталога — сервис использует каталог, в котором был создан сервисный аккаунт.

Распознать рукописный текст на изображении

Распознавание текста на изображении реализовано в методе recognize OCR API.

  1. Подготовьте файл изображения, соответствующий требованиям:

    • Поддерживаемые форматы файлов: JPEG, PNG, PDF. MIME-тип файла указывайте в свойстве mime_type. По умолчанию image.
    • Максимальный размер файла: 10 МБ.
    • Размер изображения не должен превышать 20 мегапикселей (длина × ширина).
  2. Кодируйте файл с изображением в формат Base64:

    UNIX
    Windows
    PowerShell
    Python
    Node.js
    Java
    Go
    base64 -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)
    
  3. Создайте и отправьте запрос.

    В свойстве content укажите содержимое файла, полученное при переводе изображения в формат Base64.

    Примечание

    Англо-русская модель не может быть выбрана при автоматическом определении языка. Чтобы использовать эту модель, явно укажите оба языка в свойстве languageCodes.

    Отправьте запрос с помощью метода recognize и сохраните ответ в файл, например output.json:

    UNIX
    Python
    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 '{
        "mimeType": "JPEG",
        "languageCodes": ["ru","en"],
        "model": "handwritten",
        "content": "<изображение_в_кодировке_base64>"
      }' \
      https://ocr.api.cloud.yandex.net/ocr/v1/recognizeText \
      --output output.json
    

    Где:

    • <IAM-токен> — полученный ранее IAM-токен.
    • <идентификатор_каталога> — полученный ранее идентификатор каталога.
    data = {"mimeType": <mime_type>,
            "languageCodes": ["ru","en"],
            "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"
      }
    }
    
  4. Чтобы получить все распознанные на изображении слова, найдите все значения со свойством text.

Примечание

Если полученные координаты не соответствуют отображаемому положению элементов, настройте в вашем средстве просмотра изображений поддержку метаданных exif, либо при передаче в сервис удаляйте из секции exif изображения атрибут Orientation.

Была ли статья полезна?

Предыдущая
Распознавание текста из PDF-файла
Следующая
Распознавание таблицы
Проект Яндекса
© 2025 ООО «Яндекс.Облако»