获取模板找到的对象的坐标

时间:2019-05-23 19:03:33

标签: python opencv image-processing detection

我想为游戏制作一个机器人,该机器人在地板上寻找某个物品,然后单击它。我设法使第一部分正确(它甚至在其周围绘制一个矩形),但是令人尴尬的是我无法正确地获得该对象的坐标。我使用// Initialize socket.io const http = require("http").Server(app); const io = require("socket.io")(http); // Use Routes app.use("/api/users", users); app.use("/api/chats", chats); app.use("/api/profile", profile); app.use("/api/posts", posts); //Whenever someone connects this gets executed io.on("connection", function(socket) { console.log("A user connected.........."); //Whenever someone disconnects this piece of code executed socket.on("disconnect", function() { console.log("A user disconnected........"); }); }); userChat = []; io.on("connection", function(socket) { console.log("A user connected"); socket.on("setMsgBy", function(data) { console.log(data); // check this msgBy in chatroom of database userChat.push(data); socket.emit("userSet", { msgBy: data }); }); socket.on("msg", function(data) { //Send message to everyone io.sockets.emit("newmsg", data); }); }); 方法。这是我的代码:

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()

但这根本不起作用。有人可以告诉我什么是pt,以及如何获取坐标吗?

这也是我到目前为止所取得成就的屏幕截图:

enter image description here

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

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

就要点而言,我看不到任何问题。这不是坐标问题。我猜很有可能是pyautoui函数问题。但是我无法验证,因为我似乎无法在PC上安装它。

基于示例

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

尝试先调用同一对象以排除最后一个参数问题。如果可以,则其简单格式为ise。

如果不能,则可能是图像转换问题。 pyautogui函数正在使用Pillow,它提供的格式必须适合与opencv一起使用。因此,它的数据类型是RGB,BGR还是图像坐标问题(例如,opencv指的是图像坐标,而pyautogui使用桌面坐标?)。