43 lines
2.8 KiB
C++
43 lines
2.8 KiB
C++
#pragma once
|
||
|
||
#include <QByteArray>
|
||
#include <QPoint>
|
||
#include <QString>
|
||
|
||
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
|