我想为游戏制作一个机器人,该机器人在地板上寻找某个物品,然后单击它。我设法使第一部分正确(它甚至在其周围绘制一个矩形),但是令人尴尬的是我无法正确地获得该对象的坐标。我使用// 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,以及如何获取坐标吗?
这也是我到目前为止所取得成就的屏幕截图:
答案 0 :(得分:0)
据我了解,OpenCV和pyautogui都使用与示例1920x1080
分辨率所示的相同坐标系。
0,0 X increases -->
+---------------------------+
| | Y increases
| | |
| 1920 x 1080 screen | |
| | V
| |
| |
+---------------------------+ 1919, 1079
OpenCV的cv2.rectangle
函数将矩形的左上角坐标和右下角坐标作为参数。由于您能够在图像中绘制边界框,因此您具有要检查的ROI的正确坐标。 moveTo
函数从docs获取两个参数:x
和y
。假设您要将鼠标移到边界框的中心,可以执行
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使用桌面坐标?)。