Получить координаты объектов, найденных по шаблону - PullRequest
2 голосов
/ 23 мая 2019

Я хотел сделать бота для игры, который ищет определенный предмет на полу, а затем нажимает на него.Мне удалось правильно сделать первую часть (она даже рисует прямоугольник вокруг нее), но меня смущает то, что я не могу правильно определить координаты этого объекта.Я использую cv2.matchTemplate метод.Это мой код:

import numpy as np
import pyautogui

img_bgr =  cv2.imread('gra.png')
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)

template = cv2.imread('bones2.png', 0)

w, h = template.shape[:: -1]

res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshhold = 0.90
loc = np.where( res >= threshhold)
for pt in zip(*loc[:: -1]):
    cv2.rectangle(img_bgr, pt, (pt[0] + w, pt[1] + h),(0, 255, 255), 2 )
    #here i wanted to move the mouse to the coordinates of a found item, however
    #i cant get these two right ↓        ↓
    pyautogui.moveTo(           ?     ,  ? ,duration=0.5)

cv2.imshow('znalezione', img_bgr)

cv2.waitKey()
cv2.destroyAllWindows()

Я пробовал это:

 pyautogui.moveTo( (pt[0] *2  + w)/2  , (pt[1] *2 + h)/2 ,duration=0.5)

, но это не работает вообще.Может кто-нибудь объяснить мне, что такое pt вообще и как получить координаты?

Также вот скриншот того, чего я достиг на данный момент:

enter image description here

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

в первую очередь.вам не нужно так сложный расчет

x=pt[0]
y=pt[1]
center_x = x + 0.5 * w
center_y = y + 0.5 * h

С точки зрения очков, я не вижу никаких проблем.Это не вопрос координат.Я предполагаю высокий шанс, это проблема с функцией päutoui.Но я не смог проверить, так как не могу установить его на свой ПК.

на основе примера

>>> pyautogui.moveTo(100, 200, 2) 

Попробуйте сначала вызвать то же самое, чтобы исключить проблему с последним параметром.Если можете, то его простой формат isse.

Если нет, то это может быть проблема преобразования изображения.Функция pyautogui использует Pillow, который дает формат, который должен быть адаптирован для работы с opencv.Так что это проблема типа данных RGB, BGR или координат изображения (например, opencv ссылается на координату изображения, а pyautogui использует координату рабочего стола?).

0 голосов
/ 23 мая 2019

Насколько я понимаю, и OpenCV, и pyautogui используют одну и ту же систему координат, как показано на примере разрешения 1920x1080.

0,0       X increases -->
+---------------------------+
|                           | Y increases
|                           |     |
|   1920 x 1080 screen      |     |
|                           |     V
|                           |
|                           |
+---------------------------+ 1919, 1079

Функция OpenCV cv2.rectangle принимает координаты верхнего левого угла и нижнего правого угла прямоугольника в качестве параметров.Поскольку вы смогли нарисовать ограничительную рамку на своем изображении, у вас есть правильные координаты области интереса, которую вы хотите исследовать.Из документов функция moveTo принимает два параметра: x и y.Предполагая, что вы хотите переместить мышь к центру ограничительной рамки, вы можете сделать

pyautogui.moveTo(pt[0] + w/2, pt[1] + h/2, duration=0.5)
...