Как выделить область вокруг пикселя и заставить кликер игнорировать её?
Есть кликер на 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)
