{opencv} как сместить координаты мышки в выделенную область?
При нахождении объекта на экране курсор должен на него наводиться, при полноэкранном разрешении все работает, но мне хочется оптимизировать бота и сузить область для поиска. экран у меня обрезать получается, но вот мой курсор перемещается на сохраненные в переменной координаты от ширины всего экрана, а не области которая мне нужна, не знаю как правильно реализовать чтобы координаты отчитывались от нужной мне области и как ее выделить надеюсь понятно сформулировал
Код
import time
import win32api, win32con
import os
from PIL import Image
from PIL import ImageGrab
import numpy as np
import cv2
from pprint import pformat
box = (289, 90,1067, 710)
img_hhh = cv2.imread('C:/jdws/Screenshot_1.png', 0)
def locate_image(template, threshold=0.8):
screenshot = ImageGrab.grab(box)
screenshot = np.array(screenshot)
screenshot = cv2.cvtColor(screenshot, cv2.COLOR_RGB2BGR)
screenshot_gray = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)
result = cv2.matchTemplate(screenshot_gray, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
if max_val >= threshold:
return (max_loc[0], max_loc[1])
else:
return None
while True:
vosem_loc = locate_image(img_hhh)
if vosem_loc:
rock = print(vosem_loc)
time.sleep(1)
win32api.SetCursorPos(vosem_loc)
Update: Ещё мне в любом случае нужно будет от итоговых координат отсчитывать пиксели так что если кто-то поделится методом сложения буду благодарен
Ответы (1 шт):
Я делаю вот так:
import pyautogui
import cv2
import numpy as np
# Координаты для точки скриншота \ высота и ширина от точки координат
x=289
y=90
width=1067
height=710
# Загрузка шаблона
template = cv2.imread(file_path)
screenshot = pyautogui.screenshot(region=(x, y, width, height))
screenshot = np.array(screenshot)
screenshot = cv2.cvtColor(screenshot, cv2.COLOR_RGB2BGR)
# Поиск соответствия шаблона на скриншоте
result = cv2.matchTemplate(screenshot, template, cv2.TM_CCOEFF_NORMED)
# Получение координат максимального значения соответствия
_, max_val, _, max_loc = cv2.minMaxLoc(result)
threshold = 0.8 # Пороговое значение (можно настроить)
if max_val >= threshold:
h, w = template.shape[:2] # height, width шаблона
# Вычисление координат центра совпадения
center_x = (x + max_loc[0]) + w // 2
center_y = (y + max_loc[1]) + h // 2
По итогу получаем абсолютные координаты шаблона на мониторе.
З.Ы. А если не сильно запариваться, то с OpenCV можно работать через pyautogui