如何识别桌游中的六角形拼贴?


16

我想识别照片中六角形拼贴边界,如下图所示:

在此处输入图片说明

在我看来,在正方形网格上的一种标准方法是首先检测角(例如Canny),然后通过霍夫变换或类似方法提取最长的线。

这看起来不是十六进制平铺的最佳解决方案,因为外线的长度较短,并且很难将其与其他线分开。

有解决这个问题的算法吗?在opencv中有解决方案会特别好,但是我也对一般想法感兴趣。

更新:

使用python和opencv我可以收到以下结果: 等高线

这是我的代码:

import cv2
import numpy as np

imgOrig = "test1";
img = cv2.imread(imgOrig+".jpg");  
lap = cv2.Laplacian(img, cv2.IPL_DEPTH_32F, ksize = 3)  
imgray = cv2.cvtColor(lap,cv2.COLOR_BGR2GRAY)  
ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
size = img.shape
m = np.zeros(size, dtype=np.uint8)
for i, cnt in enumerate(contours):
    if cv2.contourArea(cnt) >= 1:
        color = (255,255,255)
        cv2.drawContours(m, cnt, -1, color, -1)
cv2.imwrite(str(imgOrig)+"contours.jpg", m);

图像的拉普拉斯像: 拉普拉斯语

我将尝试优化此方法的参数,然后尝试对四个部分的边界进行插值。


5
信号处理符合欧洲博彩标准;我的怪胎感觉刺痛!
nispio

1
如果您始终使用相同尺寸的电路板,并且在图像中始终具有与电路板大致相同的视图,那么您可能能够解决该问题,就像识别电路板的轮廓以确定尺寸和对齐方式一样简单。瓷砖的放置和大小相对于板的边缘是恒定的,因此一旦知道所有边缘的位置,就应该能够准确推断出内部瓷砖的位置。
nispio

谢谢您的建议,@ nispio。电路板的尺寸始终是相同的,而电路板的外观可能会发生很大变化。其他图片中背景的颜色也不同,从而导致对比度大大降低。例如,如果背景是米色,则很难确定轮廓的位置。
snalx

1
如果您没有其他任何答案,我认为将您的修改发布为您自己的问题的一个好主意。我不确定那与赏金如何相互作用!
lmjohns3,2013年

1
@snalx:如果您将发现的问题作为答案发表,我将奖励您。不过,需要在接下来的12小时内完成。
2013年1

Answers:


6

第一种方法:

根据本教程http://note.sonots.com/SciSoftware/haartraining.html使用opencv的haartraining方法,这应该能产生最佳效果,但是到目前为止,我还没有进行过haartraining的工作。

第二种方法:

我建议使用“无标记跟踪”方法来对板的各个磁贴进行处理。您也可以使用OpenCV来实现。

制备

  1. 为此,您需要每种类型的瓷砖的一些照片。拍摄所有图块类型的图片(每个图块一幅),并在图片中间使用自顶向下视图图块的同类背景。

  2. 然后使用一些特征检测器(OpenCV为此使用多种算法,但是SIFT / SURF是非自由算法;我建议使用“ FAST”)在图像中找到明显的点。

  3. 使用特征描述符描述在图像中找到的特征(例如使用“ BRIEF”)。

侦测

现在,您可以通过对图像应用相同的特征检测器/描述符算法来检测图像中的图块。获取功能/描述符后,可以应用FlannBasedMatcher查找图块。

这是来自OpenCV的代码示例/教程:http : //docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html#feature-homography

笔记

匹配器方法只会给您一个匹配项,如果在板上找到了多个这种类型的图块,则可能会出现问题。您可以通过仅遮盖输入图像的某些部分来解决该问题。我建议使用检测到的特征的像素坐标进行此操作。如果您(以某种方式)首先检测了图块的轮廓和大小,则可以粗略估计图片上图块的位置和大小。匹配之前过滤检测到的特征列表(例如,仅在距图块预期中点x像素半径以内的特征),然后使用最强匹配。结果,您将获得图块在图像上的确切位置(包括其方向)。如果检测地图轮廓太复杂,则可以让用户“指向”角落的瓷砖以手动标记轮廓...

替代方法

您也可以使用此方法通过其轮廓查找所有磁贴。绘制一个示例“示意图”的瓷砖(六边形)灰度图片,上面没有任何图像。请注意,此图像中的“暗”和“亮”区域需要在原理图中正确,而不仅仅是一些“线”。您可能需要尝试一下。您可以尝试对不同图块的多张照片求平均,以生成图块的“平均”图像。确保拐角位于同一位置(相应地移动/缩放图片),并在完成后锐化图片(清晰的拐角/边缘应可见),并根据需要稍微调整对比度。


感谢您的建议@StefanK。我有点担心,如果将游戏块(房屋)放在瓷砖上,第一种和第二种方法是否仍然有效。您选择的替代方法看起来很麻烦,我会尝试一下(也许经过一些预处理)。
snalx

在大多数情况下,似乎可以检测到外线。我最近在与问题最终结果相似的图像上使用了Hough transfom进行了尝试。找到稳定的解决方案后,我将更新我的问题。
snalx

瓷砖上的房屋和其他游戏物件应该不成问题。这将导致某些“功能”被覆盖,但是其中一些仍将被检测到。至少需要检测4个。您可以尝试opencv的功能检测演示,并查看每个
磁贴上

3

我将描述我目前的方法,该方法是利用游戏规则,图像处理和特征检测的组合。

相关游戏规则

实现

首先,我使用霍夫变换来提取游戏板的位置。源图像看起来像最终的图像,但是线条较粗,我过滤了较小的边界。我只使用检测很长的线(数量级:大约图像宽度/高度的60%)和很小的线匹配阈值。我还只是查看图像外部40%处的线条,并以检测到的线条的中值分别位于顶部,底部,左侧和右侧。结果如下图所示: 霍夫变换

我只需要一个大概的近似值,所以这很好。从现在开始,我仅检查Houghlines内的图像,以及由于Hough变换的不确定性而产生的一些额外空间。

然后,我使用Stefan K.在他的回答中提出的特征检测功能来检测图像中无法被玩家捕获的特征,例如城堡,位置图块和山脉。我在opencv-python中使用ORB算法和BruteForce-Hamming-Matcher(我还无法使FlannBased匹配器运行)来执行此操作。ORB是缩放和旋转不变的。为了检测相同特征(例如城堡)的多次出现,我将图像分成了重叠的部分。只要图像分辨率足够大并且直接从顶部拍摄照片(仍然需要进行一些测试),此方法就可以正常工作。这也有点慢。下图显示了位置图块(酒馆)的检测示例 城堡特征检测

目前,我尝试找到homographyTransform来提取检测到的特征的精确位置和方向。

我希望能够根据这些信息(山脉,城堡,位置图块以及在大多数情况下为水)重建网格。当前的实验看起来很有希望,尽管必须进行大量的微调和适当准备特征图像。


我在Catan上做过类似的事情,但我没有使用全息照相术,而是使用任何给定图块的平均颜色值。通过预处理将瓷砖识别为6面多边形轮廓,以帮助隔离边缘,然后将ROI转换为蒙版,然后使用bitwise_and在源图像上应用蒙版。然后,您可以获取平均颜色,该颜色足以识别大多数图块,然后可以执行其他图案匹配。我才刚开始: youtube.com/watch?v=0ezfyWkio6c
Rex Hardin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.