获取模板找到的对象的坐标
Get the coordinates of the objects found by a template
我想为一款游戏制作一个机器人,它可以在地板上寻找某个物品,然后点击它。我设法让第一部分正确(它甚至在它周围画了一个矩形)但令人尴尬的是我无法正确获得该对象的坐标。我使用 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 到底是什么以及如何获得坐标吗?
此外,这是我目前取得的成果的屏幕截图:
根据我的理解,OpenCV 和 pyautogui 使用相同的坐标系,如示例 1920x1080
分辨率所示。
0,0 X increases -->
+---------------------------+
| | Y increases
| | |
| 1920 x 1080 screen | |
| | V
| |
| |
+---------------------------+ 1919, 1079
OpenCV的cv2.rectangle
函数将矩形的左上坐标和右下坐标作为参数。由于您能够在图像中绘制边界框,因此您拥有要检查的 ROI 的正确坐标。从 docs 开始,moveTo
函数采用两个参数:x
和 y
。假设你想将鼠标移动到边界框的中心,你可以这样做
pyautogui.moveTo(pt[0] + w/2, pt[1] + h/2, duration=0.5)
首先。你不需要那么复杂的计算
x=pt[0]
y=pt[1]
center_x = x + 0.5 * w
center_y = y + 0.5 * h
在积分方面,我看不出有什么问题。不是坐标问题。我猜很有可能,这是 pyautoui 功能问题。但我无法验证,因为我似乎无法在我的电脑上安装它。
基于示例
>>> pyautogui.moveTo(100, 200, 2)
尝试先调用相同的以排除最后一个参数问题。如果可以,那么它的简单格式是se。
如果不能,则可能是图像转换问题。 pyautogui 函数正在使用 Pillow,它提供了一种必须适应 opencv 的格式。所以它的数据类型RGB,BGR或图像坐标问题(例如opencv指的是图像坐标,而pyautogui使用桌面坐标?)。
我想为一款游戏制作一个机器人,它可以在地板上寻找某个物品,然后点击它。我设法让第一部分正确(它甚至在它周围画了一个矩形)但令人尴尬的是我无法正确获得该对象的坐标。我使用 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 到底是什么以及如何获得坐标吗?
此外,这是我目前取得的成果的屏幕截图:
根据我的理解,OpenCV 和 pyautogui 使用相同的坐标系,如示例 1920x1080
分辨率所示。
0,0 X increases -->
+---------------------------+
| | Y increases
| | |
| 1920 x 1080 screen | |
| | V
| |
| |
+---------------------------+ 1919, 1079
OpenCV的cv2.rectangle
函数将矩形的左上坐标和右下坐标作为参数。由于您能够在图像中绘制边界框,因此您拥有要检查的 ROI 的正确坐标。从 docs 开始,moveTo
函数采用两个参数:x
和 y
。假设你想将鼠标移动到边界框的中心,你可以这样做
pyautogui.moveTo(pt[0] + w/2, pt[1] + h/2, duration=0.5)
首先。你不需要那么复杂的计算
x=pt[0]
y=pt[1]
center_x = x + 0.5 * w
center_y = y + 0.5 * h
在积分方面,我看不出有什么问题。不是坐标问题。我猜很有可能,这是 pyautoui 功能问题。但我无法验证,因为我似乎无法在我的电脑上安装它。
基于示例
>>> pyautogui.moveTo(100, 200, 2)
尝试先调用相同的以排除最后一个参数问题。如果可以,那么它的简单格式是se。
如果不能,则可能是图像转换问题。 pyautogui 函数正在使用 Pillow,它提供了一种必须适应 opencv 的格式。所以它的数据类型RGB,BGR或图像坐标问题(例如opencv指的是图像坐标,而pyautogui使用桌面坐标?)。