我的目标是编写一个玩扫雷机的机器人,但当我想告诉机器人,正方形在哪里时,我被卡住了。我尝试了很多不同的功能。 首先,我的工具抓取预定义区域的屏幕截图。这张照片看起来是这样的:screenshot of game boardOpencv/python - 我如何获得图像处理后检测到的区域的坐标
后,我要填补这样一个numpy的数组:
info_map = np.ones((board_height=9, board_width=9),
dtype = np.uint8)*11
>array([[11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11],
[11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11],
...
[11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11]], dtype=uint8
11代表在本例中为“未发现”或蓝色的,不变的平方。
借助opencv square检测器,我从例子中得到了一个包含检测点的巨大列表(一个9x9网格的近5000个点)。我不知道如何去除所有的噪音,以获得正确的角落。所以我来到了下一个示例如下表:
我最后的尝试是以下几点:
import glob
import cv2
import numpy as np
import sys
def canny_edge():
"""This function is taken from SentDex from one of his fantastic Python
tutorials.
https://pythonprogramming.net/canny-edge-detection-gradients-python-opencv-tutorial/
"""
for fn in glob('full_snap.png'):
img = cv2.imread(fn)
while(1):
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_red = np.array([30,150,50])
upper_red = np.array([255,255,180])
mask = cv2.inRange(hsv, lower_red, upper_red)
#res = cv2.bitwise_and(img, img, mask= mask)
laplacian = cv2.Laplacian(img, cv2.CV_64F)
#edges = cv2.Canny(img,100,200)
cv2.imwrite(os.getcwd() + '\\laplace.png', laplacian)
这是保存图像: laplace.png
在这里,我试图做一个为了遍历拉普拉斯算子来检查像素是否是蓝色的,并且将第一个像素作为锚点告诉机器人,从锚点(起始点)开始,在x方向上和x方向上每x个像素有一个正方形年。但有没有更好的方法来自动执行它?
但我的主要问题是如何将图像处理后的方块连接成一个numpy数组,我可以告诉机器人click_square(1,2),他知道至少有第1行和第2列的方块。
提示:我的坐标系在屏幕的左上角开始。
谢谢你的帮助。 Robinarthur
不是在opencv中的这个样本做到这一点吗? https://github.com/opencv/opencv/blob/master/samples/python/squares.py – BoboDarph
这是我第一次使用的方法,并在你的答案,而我保存图像后,我的功能与这个例子做了我得到回答我想。几天前squares.py给了我5000点的巨大名单,每个角落都有10个不同的点。但几秒钟前,我想到了正确的答案。现在我只需要厚点的中心点,从squares.py第51行开始画。谢谢 – robinarthur