#pragma once #include #include #include namespace OcrUtils { // Находит надпись `needle` на скриншоте (PNG-байты) и возвращает координаты // центра bounding box-а в системе координат экрана. Если текст не найден — // возвращает QPoint(-1, -1). Совпадение нечувствительно к регистру и допускает // одну-две OCR-ошибки в букве (для "Подтверждаю" на оранжевом фоне это важно). // // `yMin`/`yMax` — необязательное окно по Y в координатах экрана. Если задано, // OCR гоняется только по этой полосе, что в 2-3 раза быстрее на 1080×2340. // 0/0 — обрабатывать всё изображение. QPoint findTextCenter(const QByteArray &png, const QString &needle, int yMin = 0, int yMax = 0); // Находит крупную сплошную кнопку заданного цвета (по умолчанию — оранжевая // sticky-action кнопка Dushanbe "Подтверждаю"/"Оплатить", RGB(255,117,40)) и // возвращает центр её bounding box в координатах экрана (= пиксели скриншота). // // В отличие от findTextCenter не зависит от текста, контраста и языка: OCR на // белом-по-оранжевому ненадёжен, а сплошной цветной прямоугольник ловится // стабильно. Алгоритм — поиск самой длинной вертикальной полосы строк, где // доля пикселей целевого цвета превышает порог по ширине; это отсекает мелкие // цветные иконки в статус-баре и ловит именно широкую кнопку. Координаты // относительные по построению, поэтому работает на любом разрешении. // // `yMin`/`yMax` — необязательное окно по Y (координаты экрана), 0/0 — весь // кадр. Возвращает QPoint(-1, -1), если подходящей полосы не найдено. QPoint findColorButtonCenter(const QByteArray &png, int targetR = 255, int targetG = 117, int targetB = 40, int tolerance = 55, int yMin = 0, int yMax = 0); } // namespace OcrUtils