|
Tesseract OCR, Распознавание текста (OCR) для UOPilot (FFI, фильтры) |
|
|
| Madeus |
12.11.2025, 15:20
|

    
Journeyman
Сообщений: 320
Регистрация: 19.11.2019 Группа: Пользователи Наличность: 11687
Пользователь №: 19.451
Возраст: 32

|
Делюсь полноценным модулем для распознавания текста (OCR) на базе Tesseract и Leptonica. Это не обертка, а прямая работа с DLL через ffi, что дает полный контроль над процессом и высокую скорость. Возможности- Два режима работы: "auto" (быстрый, для простых задач) и "manual" (с полным контролем фильтров предобработки).
- Поддержка всех режимов сегментации Tesseract (PSM) и движков (OEM).
- Возврат как простого текста, так и таблицы с текстом и координатами.
- Мощный набор фильтров Leptonica: масштабирование, повышение резкости (Unsharp Mask), эквализация гистограммы, медианный фильтр, инверсия и три вида бинаризации (Simple, Otsu, Sauvola).
- Подробная отладка с сохранением промежуточных изображений в корень UOPilot.
- Постобработка для исправления ошибок OCR (например, gsub для удаления лишних пробелов).
Установка и Зависимости- Скачайте прикрепленные архивы tesseract.zip и tessdata.zip.
- Распакуйте их в корневую папку UOPilot.
- В итоге в корне UOPilot у вас должны появиться: Как выбрать языковую модель:
- tessdata_fast: Самые быстрые, но менее точные (для 90% задач разница незаметна). (по умолчанию)
- tessdata: Стандартные.
- tessdata_best: Самые точные, но немного медленнее.
Чтобы сменить модель, скачайте нужные файлы, и просто поменяйте путь в своем скрипте, например: tess.data_path = 'tessdata_best'
Пример 1: Простое распознавание текста
Код --lua -- Подключаем модуль local tess = require('tesseract')
-- [ОПЦИОНАЛЬНО] Меняем папку с языковыми моделями tess.data_path = 'tessdata_fast'
-- [ОПЦИОНАЛЬНО] Задаем любые настройки tess.options.page_seg_mode = "6" -- Считаем, что на картинке один блок текста tess.options.preprocessing_mode = "auto" tess.options.tesseract_invert = true -- Полезно для темных тем
-- Выполняем OCR local image_address, width, height, length = getimage(0, 0, 100, 50, 'abs') if image_address ~= 0 then local results = tess.ocr(image_address, width, height, length) deleteimage(image_address) log(results) end Пример 2: Поиск по координатам и перемещение мыши
Этот пример использует ручной режим с фильтрами, ищет слово "Скрипт" (в интерфейсе UOPilot) и перемещает мышь в его центр. Перед запуском примера разверните окно UOPilot во весь экран!Код --lua local tess = require('tesseract')
-- Включаем ручной режим и настраиваем фильтры tess.options.preprocessing_mode = "manual" -- Включаем фильтры tess.options.return_coordinates = true -- Хотим получить координаты tess.options.recognition_level = "word" -- Искать по словам tess.options.page_seg_mode = "3" -- Авто-поиск
-- Включаем фильтры tess.options.scale_up = true -- Включить масштабирование tess.options.scale_factor = 2.0 -- Увеличить в 2 раза (для мелкого шрифта) tess.options.unsharp_mask = true -- Включить повышение резкости tess.options.binary = true -- Включить бинаризацию tess.options.binary_method = "simple" tess.options.binary_threshold = 180 -- Подобрать свой порог
-- Делаем скриншот части окна UOPilot local image_address, width, height, length = getimage(0, 0, 500, 500, 'abs') if image_address == 0 then log("Не удалось получить изображение") return end
local results = tess.ocr(image_address, width, height, length) deleteimage(image_address)
if type(results) ~= "table" then log("Ничего не найдено") return end
-- Ищем нужное слово в результатах local found = false for _, data in ipairs(results) do if data.text == "Скрипт" then log("Найдено слово 'Скрипт' в координатах: " .. data.left .. "," .. data.top) -- Считаем центр слова local x = math.floor((data.left + data.right) / 2) local y = math.floor((data.top + data.bottom) / 2) -- Перемещаем мышь move(x, y) found = true break -- Выходим из цикла, т.к. нашли end end
if not found then log("Слово 'Скрипт' не найдено") end Полный список настроек (tess.options)Вы можете управлять каждым аспектом распознавания, меняя значения в tess.options в своем скрипте. tess.options
Код --[[ ============================================================================== БЛОК КОНФИГУРАЦИИ (tess.options) ============================================================================== ]] tess.options = { -- -- 1. ОБЩИЕ НАСТРОЙКИ OCR -- -- (string) Режим предобработки. -- * "auto": Быстрый режим. Tesseract сам обрабатывает 24-битное изображение. Работает хорошо, но не позволяет применять фильтры. -- * "manual": Ручной режим. Включает всю цепочку фильтров Leptonica (to_gray, scale, median, binary и т.д.). preprocessing_mode = "auto",
-- (boolean) Возвращать ли координаты. -- * true: Возвращает таблицу { {text="...", left=0, top=0, right=0, bottom=0}, ... } -- * false: Возвращает одну строку с распознанным текстом. return_coordinates = false,
-- (string) Уровень детализации для 'return_coordinates = true'. -- Управляет тем, *как* итератор будет обходить распознанный текст. -- Не влияет на 'get_text_only'. -- * "block": Группирует текст в большие блоки. -- * "para": Группирует в параграфы. -- * "textline": Группирует в строки (полезно для чтения чатов). -- * "word": Каждое слово - отдельный элемент (стандарт). -- * "symbol": Каждый символ - отдельный элемент. recognition_level = "word", -- (boolean) Применять ли постобработку (замены из 'tess.postprocess_text'). -- Полезно для исправления частых ошибок OCR или форматирования. -- Пример: tess.postprocess_text = { {"%s+", " "}, {"Il", "ll"} } -- (Этот пример уберет двойные пробелы и заменит "Il" на "ll") use_postprocess = false, -- -- 2. НАСТРОЙКИ ДВИЖКА TESSERACT -- -- (string) Режим сегментации страницы (PSM). (0-13) -- * "0": Только определение ориентации и скрипта (OSD). -- * "1": Автоматическая сегментация страницы с OSD. -- * "2": Автоматическая сегментация, но без OSD или OCR. -- * "3": Полностью автоматическая сегментация, но без OSD (Стандарт). -- * "4": Один столбец текста переменного размера. -- * "5": Один блок вертикально выровненного текста. -- * "6": Один равномерный блок текста. -- * "7": Считать изображение одной текстовой строкой. -- * "8": Считать изображение одним словом. -- * "9": Считать изображение одним словом в круге. -- * "10": Считать изображение одним символом. -- * "11": Разреженный текст (найти как можно больше текста без порядка). -- * "12": Разреженный текст с OSD. -- * "13": "Сырая" строка (считать одной строкой, отключая спец. обработку). page_seg_mode = "3", -- (string) Режим OCR-движка (OEM). (0-3) -- * "0": Только Tesseract (старый "Legacy" движок). -- * "1": Только нейросеть (LSTM) (Рекомендуется для Tesseract 5). -- * "2": Tesseract (Legacy) + Нейросеть (LSTM) (Комбинированный). -- * "3": По умолчанию (выбирает лучший доступный, обычно LSTM/1). ocr_engine_mode = "1",
-- (string / false) Белый список. Tesseract будет распознавать *только* эти символы. -- Пример: "0123456789" (только цифры) whitelist = false,
-- (string / false) Черный список. Tesseract будет игнорировать эти символы. -- Пример: ".,!?" (игнорировать пунктуацию) blacklist = false, -- (boolean) Сохранять ли пробелы между словами. -- * true: "Hello World" вернет "Hello World" (если там 4 пробела). -- * false: "Hello World" вернет "Hello World" (один пробел). preserve_spaces = false, -- (boolean) Внутренняя инверсия Tesseract. Полезно для тёмных фонов в режиме "auto". -- Не рекомендуется использовать, если 'invert = true' в режиме "manual". tesseract_invert = false, -- (number) Устанавливает DPI (точек на дюйм) для изображения. -- Tesseract лучше работает с DPI >= 300. Оставьте nil, если не уверены. dpi = nil, -- (string) Оптимизация вычислений. "auto" - лучший выбор. -- "auto", "generic", "native", "avx", "sse". dotproduct = "auto", -- (number) ID шрифта. Используется, если вы вручную тренировали Tesseract -- на распознавание специфического шрифта. Оставьте 'nil' (неактивно). font_id = nil, -- -- 3. НАСТРОЙКИ РУЧНОЙ ПРЕДОБРАБОТКИ (для preprocessing_mode = "manual") -- -- (table) Порядок применения фильтров. -- ВАЖНО: 'to_gray' всегда вызывается первым, независимо от этого списка. filter_order = {"scale_up", "equalize_hist", "median", "unsharp_mask", "invert", "binary"},
-- (boolean) Включить масштабирование. scale_up = false, -- (number) Коэффициент масштабирования. 1.0 = без изменений. -- Увеличение (например, 2.0) часто улучшает распознавание мелкого шрифта. scale_factor = 1.0,
-- (boolean) Включить эквализацию гистограммы. -- "Растягивает" контраст. Полезно для блеклых изображений, где все -- пиксели, например, темно-серые. На контрастных скриншотах -- эффекта не даст. equalize_hist = false, -- (boolean) Включить медианный фильтр. -- Удаляет шум типа "соль и перец" (одиночные пиксели). median = false, -- (number) Размер "окна" для медианного фильтра (нечетное, >= 3). -- 3 = слабое, 5 = сильное удаление шума. median_size = 3, -- (boolean) Включить фильтр повышения резкости (Unsharp Masking). -- Делает размытые края букв более четкими. unsharp_mask = false, -- (number) Размер "окна" для фильтра резкости (нечетное, >= 3). unsharp_size = 5, -- (float) Коэффициент повышения резкости (0.0 - 1.0). -- 0.5 = стандарт. unsharp_fract = 0.5, -- (boolean) Включить инверсию (черное <-> белое). -- Tesseract ожидает *черный* текст на *белом* фоне. -- Если у вас белый текст на черном, включите это (invert = true). invert = false,
-- (boolean) Включить бинаризацию (преобразование в ч/б). binary = false,
-- (string) Метод бинаризации. -- * "simple": Простой порог (задается 'binary_threshold'). -- * "otsu": Адаптивный метод Оцу. -- * "sauvola": Адаптивный метод Сауволы. -- -- Совет: "simple" - лучший выбор для чистых скриншотов с ровным фоном -- (как в играх или программах). "otsu" и "sauvola" - для -- изображений с тенями, градиентами или неравномерным освещением. binary_method = "simple", -- (number) Порог для 'binary_method = "simple"' (0-255). binary_threshold = 128,
-- --- Настройки для Otsu ('binary_method = "otsu"') --- -- (number) Размер "плитки" по X для анализа (>= 16). -- Leptonica разделит изображение на сетку и найдет порог для каждой плитки. otsu_tile_x = 32, -- (number) Размер "плитки" по Y для анализа (>= 16). otsu_tile_y = 32, -- (number) Сглаживание карты порогов по X (0 = нет, 2 = стандарт). -- Убирает резкие "швы" между плитками. otsu_smooth_x = 2, -- (number) Сглаживание карты порогов по Y (0 = нет, 2 = стандарт). otsu_smooth_y = 2, -- (float) Коэффициент оценки (0.0 - 1.0). 0.1 - стандарт. (Лучше не трогать). otsu_score_fract = 0.1,
-- --- Настройки для Sauvola ('binary_method = "sauvola"') --- -- (number) Размер "окна" анализа (нечетное, >= 15). -- Алгоритм смотрит на пиксели в этом окне для принятия решения. sauvola_whsize = 15, -- (float) Коэффициент (0.0 - 1.0). 0.35 - стандарт. -- Повышение (напр. 0.5) сделает текст жирнее, понижение - тоньше. sauvola_factor = 0.35, -- (number) Количество плиток по X, на которые делится изображение (1 = не делить). sauvola_nx = 1, -- (number) Количество плиток по Y (1 = не делить). sauvola_ny = 1,
-- -- 4. НАСТРОЙКИ ОТЛАДКИ -- -- (boolean) Включить подробные лог-сообщения в консоль UOPilot. debug = false, -- (boolean) Сохранять промежуточные изображения (to_gray.bmp, binary.bmp и т.д.) -- в корневую папку UOPilot. save_intermediate_images = false, }
Прикрепленные файлы
tesseract_1.0.zip ( 2,84 мегабайт )
Кол-во скачиваний: 7
tessdata.zip ( 3,48 мегабайт )
Кол-во скачиваний: 7
|
|
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|