Как выделить область вокруг пикселя и заставить кликер игнорировать её?

Есть кликер на Python, который ищет пиксель с нужным цветом и кликает на него раз в какое-то кол-во времени.
Как можно выделить область вокруг этого пикселя, и если кликер уже сработал на этот пиксель, то игнорировать область с заданным размером?
Хорошо, если он будет забывать, что это была за область, до следующего клика.

import time
import numpy as np
from mss import mss
import pyautogui as pg
import keyboard

monitor = {
    "left": 1,
    "top": 1,
    "width": 1920,
    "height": 1080,
}

# Поиск цвета на экране
def find_color(our_color, monitor={}):
    # Возмём кусок экрана
    m = mss()

    # Получаем пиксель с экрана монитора
    img = m.grab(monitor)

    # Преобразуем этот пиксель в матрицу
    img_arr = np.array(img)

    # Поиск цвета (b, g, r, alpha)
    our_map = (our_color[2], our_color[1], our_color[0], 255)
    indexes = np.where(np.all(img_arr == our_map, axis=-1))
    our_crd = np.transpose(indexes)
    return our_crd


# Искомый цвет
our_color = [255, 13, 0]

while True:
    time1 = time.time()
    result = find_color(our_color, monitor)
    time2 = time.time()
    if result.__len__():
        x = result[0][1] + monitor.get('left')
        y = result[0][0] + monitor.get('top')
        pg.moveTo(x, y)
        pg.click(x,y)


    # Ожидание
    time.sleep(1)

Ответы (1 шт):

Автор решения: Amgarak

Вот вам пример с OpenCV

import cv2
import numpy as np
import os

# Загрузка исходника, тут можно передать скриншот. 
image = cv2.imread('QsAY5r3.png')

# Папка с шаблонами
templates_folder = 'img2'

# Проход по каждому шаблону в папке
for template_file in os.listdir(templates_folder):
    template_path = os.path.join(templates_folder, template_file)
    print(template_path)
    # Шаблон
    template = cv2.imread(template_path)

    # Совпадение по шаблону
    result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)

    # Порог "хороших" совпадений
    threshold = 0.95

    # Позиции, где совпадение превышает порог
    locations = np.where(result >= threshold)

    # Рисуем прямоугольник по полученной позиции и выводим координаты центра
    for loc in zip(*locations[::-1]):
        top_left = loc
        bottom_right = (loc[0] + template.shape[1], loc[1] + template.shape[0])
        center = ((top_left[0] + bottom_right[0]) // 2, (top_left[1] + bottom_right[1]) // 2)

        cv2.rectangle(image, top_left, bottom_right, (0, 255, 0), 2)
        

        # Выводим координаты центра
        print(f"Шаблон: {template_file}, Центр совпадения: {center}")

# Наш результат
cv2.imshow('Найденные места', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('detected_lines_with_centers.jpg', image)

Картинка для поиска: введите сюда описание изображения

Что искал (картинки из папки 'img2'):введите сюда описание изображения введите сюда описание изображения

Формат вывода координат:

img2\1.png
Шаблон: 1.png, Центр совпадения: (729, 323)
img2\2.png
Шаблон: 2.png, Центр совпадения: (1114, 462)

Вот как раз по ним можете и откликаться.

Пример для создания скриншота:

import pyautogui

left = 33
top = 67
width = 950
height = 520 

screenshot = pyautogui.screenshot(region=(left, top, width, height))   
screenshot = np.array(screenshot)
screenshot = cv2.cvtColor(screenshot, cv2.COLOR_RGB2BGR)
→ Ссылка