Я использую OpenCV с поддержкой CUDA/CUBLAS/CUFFT для выполнения очень простого сопоставления шаблонов на скриншотах в градациях серого для извлечения некоторого текста, то есть я могу предположить следующее:
Я знаю точный размер, цвет и поворот необработанных спрайтов, которые я пытаюсь сопоставить, то есть у меня есть доступ к текстурам, которые использовались в процессе рендеринга наблюдаемой программы.
Однако, поскольку спрайты частично прозрачны, обычное сопоставление с шаблоном через cv::(gpu::)matchTemplate
(используя нормированную взаимную корреляцию) не работает должным образом, поскольку отклонения в прозрачных областях слишком сильно влияют на общую корреляцию.
В основном эти примеры довольно хорошо обобщают то, чего я пытаюсь достичь:
Учитывая шаблон, который нужно сопоставить, и его альфа-маску:
Я бы хотел, чтобы на таких изображениях было совпадение от высокого до почти 100% (произвольный фон, случайные вещи в прозрачных областях, частично закрытые):
Однако такие изображения должны иметь очень низкий процент (неправильный цвет, полностью черный):
В настоящее время я использую обнаружение края, чтобы получить приличные совпадения (Канни + кросс-корреляция), но, как вы можете видеть, в зависимости от фона на изображении могут присутствовать или отсутствовать края, что дает ненадежные результаты и обычно соответствует очень «резким» областям.
Я провел некоторые математические расчеты, чтобы получить альфа-зависимую нормированную взаимную корреляцию (по сути, предварительное умножение альфа-маски как на шаблон, так и на изображение), которая отлично работает на бумаге, но практически невозможно реализовать с хорошей производительностью. И да, производительность действительно является проблемой, поскольку несколько спрайтов (~ 10) должны сопоставляться почти в реальном времени (~ 10 кадров в секунду), чтобы не отставать от скорости программы.
У меня тут заканчиваются идеи. Есть ли какие-то стандартные подходы к этому? Любые идеи или предложения?