我正在尝试使用 OpenCV 从 iPhone 游戏Blocked中“解析”屏幕截图。屏幕截图被裁剪为如下所示:
我想现在我只是想找到构成每个矩形的 4 个点的坐标。我确实看到了 OpenCV 附带的示例文件 squares.c,但是当我在这张图片上运行该算法时,它会出现 72 个矩形,包括我显然不想算作我的一个的空白矩形区域矩形。有什么更好的方法来解决这个问题?我尝试做一些谷歌研究,但对于所有搜索结果,相关的可用信息很少。
我正在尝试使用 OpenCV 从 iPhone 游戏Blocked中“解析”屏幕截图。屏幕截图被裁剪为如下所示:
我想现在我只是想找到构成每个矩形的 4 个点的坐标。我确实看到了 OpenCV 附带的示例文件 squares.c,但是当我在这张图片上运行该算法时,它会出现 72 个矩形,包括我显然不想算作我的一个的空白矩形区域矩形。有什么更好的方法来解决这个问题?我尝试做一些谷歌研究,但对于所有搜索结果,相关的可用信息很少。
已经讨论过类似的问题: 如何识别此图像中的矩形?
至于您的数据,您试图找到的矩形是唯一的黑色对象。因此,您可以尝试进行阈值二值化:黑色像素是那些所有三个 RGB 值都小于 40 的像素(我凭经验发现)。这个简单的操作让你的图片看起来像这样:
之后,您可以应用霍夫变换来查找线条(在我提到的主题中讨论过),或者您可以更轻松地完成它。计算黑色像素到 X 和 Y 轴的积分投影。(到 X 的投影是 x_i 的向量 - 黑色像素的数量,因此它的第一个坐标等于 x_i)。因此,您得到可能的 x 和 y 值作为投影的峰值。然后查看所有受找到的 x 和 y 限制的可能段(如果 (x_i, y_j) 和 (x_i, y_k) 之间有很多黑色像素,则可能有一条线)。最后,将线段组合成矩形!
我最终只是建立在我原来的方法上,并按照罗伯特在他对我的问题的评论中建议的那样做。在获得矩形列表后,我会遍历并计算每个矩形的平均颜色。我检查平均颜色的红色、绿色和蓝色分量是否在灰色和蓝色矩形颜色的 10% 范围内,如果是,我保存矩形,如果不是,我丢弃它。这个过程给了我这样的东西:
由此,获取我需要的信息(方向、起点和每个矩形的长度,将游戏窗口视为 6x6 网格)是微不足道的。
这是一个完整的 Python 解决方案。主要思想是:
这是每个检测到的矩形轮廓的可视化
结果
import cv2
image = cv2.imread('1.png')
blur = cv2.pyrMeanShiftFiltering(image, 11, 21)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.015 * peri, True)
if len(approx) == 4:
x,y,w,h = cv2.boundingRect(approx)
cv2.rectangle(image,(x,y),(x+w,y+h),(36,255,12),2)
cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()
这些块看起来像位图 - 为什么不使用简单的模板匹配每个块大小/颜色/方向的不同模板?
由于您的问题是小矩形,因此我将从删除它们开始。由于这些线比矩形的边界要细得多,我将从对图像应用形态学操作开始。
使用如下所示的结构元素:
element = [ 1 1
1 1 ]
应该删除小于两个像素宽的线条。删除小线后,OpenCV 的矩形查找算法很可能会为您完成剩下的工作。腐蚀可以通过函数在 OpenCV 中完成cvErode
尝试众多角检测器之一,如哈里斯角检测器。同样,在多个分辨率下尝试通常也是一个好主意:对不同放大倍率进行一些预处理。看来你想要某种颜色为主的正方形,然后你可以抑制其他颜色,首先使用类似 cvsplit ......然后对颜色进行阈值处理......所以只剩下那个区域......跟随它种植手术......我认为这也可以......