【发布时间】:2017-08-31 13:55:02
【问题描述】:
我的目标是编写一个玩扫雷的机器人,但是当我想告诉机器人方块在哪里时,我就卡在了这一点上。我尝试了很多不同的功能。 首先,我的工具会抓取一个预定义区域的屏幕截图。这张图是这样的:screenshot of game board
之后我想用这种方式填充一个 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 方形检测器的帮助下,我得到了一个包含检测点的巨大列表(对于 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
在这里,我尝试在拉普拉斯算子上进行 for 循环以检查像素是否为蓝色,并将第一个作为锚点告诉机器人,从锚点(起点)开始,每个像素都有一个正方形x 方向和 y 方向的 x 像素。但是有没有更好的方法来自动完成呢?
但我的主要问题是如何将经过图像处理的正方形连接到一个 numpy 数组中,我可以告诉机器人 click_square(1,2),他知道像素是第 1 行和第 2 列的正方形。
提示:我的坐标系从屏幕的左上角开始。
感谢您的帮助。 罗宾亚瑟
【问题讨论】:
-
opencv 中的这个示例不正是这样做的吗? github.com/opencv/opencv/blob/master/samples/python/squares.py
-
这是我第一次使用的方法,在你的回答之后,我保存了我的函数对这个例子所做的图像,我得到了我认为的答案。几天前,squares.py 给了我一个包含 5000 点的巨大列表,每个角落都可能有 10 个不同的点。但是几秒钟前我得到了我认为的正确答案。现在我只需要粗点的中心点,从 squares.py 第 51 行绘制。谢谢
标签: python opencv numpy image-processing bots