# Операции распознавания текста (OCR)

В этой главе описывается, как использовать OCR для помощи в операциях с интерфейсом. В таких случаях, как игровые приложения, где обычные селекторы интерфейса могут быть недоступны, вы можете использовать методы OCR. Метод распознавания OCR поддерживает только такие операции, как проверка существования элемента, клик, создание скриншота и т.д. Библиотека бэкенда OCR поддерживает использование paddleocr, easyocr, а также пользовательские HTTP-интерфейсы бэкенда.

## Настройка бэкенда OCR

Перед использованием метода распознавания OCR необходимо сначала настроить бэкенд OCR. Вам необходимо самостоятельно **заранее установить необходимые зависимости**.

```{attention}
Если вы работаете с кластером, то есть управляете несколькими устройствами на одном компьютере, обязательно создайте собственный HTTP-интерфейс для OCR. Прямое использование paddleocr или easyocr будет потреблять большое количество оперативной памяти или вычислительных ресурсов, поскольку каждый процесс будет загружать их заново.
```

Использование paddleocr в качестве бэкенда, качество скриншота для распознавания установлено на 80, используется ускорение на GPU.

```python
d.setup_ocr_backend("paddleocr", quality=80, use_gpu=True, drop_score=0.85, use_space_char=True)
```

Использование easyocr в качестве бэкенда, качество скриншота для распознавания установлено на 80, распознаются упрощенный китайский и английский языки.

```python
d.setup_ocr_backend("easyocr", ["ch_sim", "en"], quality=80)
```

Дополнительные параметры в `setup_ocr_backend` должны быть параметрами для инициализации этого экземпляра. Если вы не уверены, как правильно пишутся эти параметры, посмотрите на официальные параметры инстанцирования ниже и сравните их с приведенными выше.

```python
paddleocr.PaddleOCR(use_gpu=True, drop_score=0.85, use_space_char=True)
easyocr.Reader(["ch_sim", "en"])
```

Пользовательский бэкенд OCR в основном используется для управления большим количеством устройств или в случаях, когда на локальной машине нет ускорения на GPU. Вы можете развернуть написанный вами сервис распознавания как HTTP-сервис и запрашивать удаленное распознавание из вашего пользовательского бэкенда. Вам потребуется самостоятельно реализовать класс, унаследованный от `MyCustomOcrBackend`, и форматировать результаты распознавания в соответствии с требуемым форматом. Определение формата ответа можно найти в предоставленном нами файле `paddle_ocr_http_backend.py`, который также можно немного изменить и развернуть напрямую.

```python
class HttpOcrBackend(CustomOcrBackend):
    def __init__(self, url, auth):
        self.auth = auth
        self.url = url
    def ocr(self, image: bytes):
        r = requests.post(url, headers={"X-Auth": self.auth},
                                                    data=image)
        return r.json()
```

Затем просто установите пользовательский класс сервиса в качестве бэкенда для распознавания OCR.

```python
d.setup_ocr_backend(HttpOcrBackend, "http://server/ocr", "Secret")
```

## Селекторы OCR

В настоящее время селекторы распознавания OCR поддерживают только следующие типы.

### text

Полное совпадение текста.

```python
element = d.ocr(text="我的")
```

### textContains

Совпадение по содержанию текста (подстрока).

```python
element = d.ocr(textContains="我的")
```

### textMatches

Совпадение текста по регулярному выражению.

```python
element = d.ocr(textMatches=".*?我的")
```

## Операции OCR

В настоящее время селекторы распознавания OCR поддерживают только следующие связанные операции.

### click

Кликнуть по выбранному элементу.

```python
element.click()
```

### click_exists

Кликнуть по выбранному элементу, если он существует.

```python
element.click_exists()
```

### exists

Существует ли элемент.

```python
element = d.ocr(textMatches=".*?我的")
```

### screenshot

Сделать скриншот элемента, соответствующего условию.

```python
element.screenshot(100, ).save("element.png")
```

### info

Получить информацию о найденном с помощью OCR элементе.

```python
element.info()
```

```{tip}
Если OCR все еще не решает вашу проблему, вы также можете попробовать использовать интерфейсы сопоставления изображений по признакам.
```