【问题标题】:Get the coordinates of the objects found by a template获取模板找到的对象的坐标
【发布时间】:2019-05-23 19:03:33
【问题描述】:

我想为一款游戏制作一个机器人,它会在地板上寻找某个物品,然后点击它。我设法让第一部分正确(它甚至在它周围画了一个矩形)但令人尴尬的是我无法正确获得该对象的坐标。我使用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 到底是什么以及如何获取坐标吗?

另外这里是我目前取得的成果的屏幕截图:

【问题讨论】:

    标签: python opencv image-processing detection


    【解决方案1】:

    据我了解,OpenCV 和 pyautogui 都使用相同的坐标系,如 1920x1080 分辨率示例所示。

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

    OpenCV 的cv2.rectangle 函数将矩形的左上角坐标和右下角坐标作为参数。由于您能够在图像中绘制边界框,因此您拥有要检查的 ROI 的正确坐标。从docsmoveTo 函数有两个参数:xy。假设您要将鼠标移动到边界框的中心,您可以这样做

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

    【讨论】:

    • 天哪,我在阅读本文前 5 秒就想到了这一点。 (我得到了相同的解决方案)问题是 pyautogui 和 OpenCV 不使用相同的坐标系,因为图像不是全屏的。你有什么办法让他们“亲吻”吗?
    • 嗯?我相信他们使用如图所示的相同坐标系。即使图像是全屏的,(0,0) 也会出现在左上角,(max X, max Y) 会出现在右下角。你能详细说明一下你所说的吻是什么意思吗?
    • OpenCVs 坐标系从图像的左上角开始,pyautoguis 从我的屏幕左上角开始。你能以某种方式强制 pyautogui 使用 OpenCVs 系统吗?
    • 我对 pyautogui 不太熟悉,也许你应该为此另开一个问题
    【解决方案2】:

    首先。你不需要这么复杂的计算

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

    就积分而言,我没有看到任何问题。不是坐标问题。我想很有可能,这是 pyautoui 功能问题。但我无法验证,因为我似乎无法在我的电脑上安装它。

    基于示例

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

    尝试先调用相同的以排除最后一个参数问题。如果可以,那么它的简单格式就是问题。

    如果不能,则可能是图像转换问题。 pyautogui 函数正在使用 Pillow,它提供了一种必须适应 opencv 的格式。所以它的数据类型 RGB、BGR 或图像坐标问题(例如 opencv 引用图像坐标,而 pyautogui 使用桌面坐标?)。

    【讨论】:

      猜你喜欢
      • 2018-08-06
      • 2012-03-31
      • 1970-01-01
      • 2013-08-18
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多