Здравствуйте, гость ( Вход | Регистрация )

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


*****

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 у вас должны появиться:
    • Все DLL (tesseract55.dll, leptonica1860.dll, jpeg62.dll, libpng16.dll и т.д.).
    • Папка lua с модулем tesseract.lua.
    • Папка с языковыми моделями: tessdata_fast с русским и английским языковыми файлами. Как выбрать языковую модель:
      • 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 мегабайт ) Кол-во скачиваний: 6
Прикрепленный файл  tessdata.zip ( 3,48 мегабайт ) Кол-во скачиваний: 6
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
Madeus   Tesseract OCR   12.11.2025, 15:20
DarkMaster   респект   12.11.2025, 15:28


Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 17.11.2025, 13:52
Designed by Nickostyle