ボードゲームで六角形のタイルを認識する方法は?


16

以下の画像のように、写真の六角形のタイルの境界を認識したいと思います。

ここに画像の説明を入力してください

正方形のグリッドでの標準的なアプローチは、最初にコーナー(例:キャニー)を検出し、次にハフ変換などを使用して最も長い線を抽出することです。

これは、外側の線の長さが短く、他の線と区別するのが難しいため、16進タイリングでは最適なソリューションではありません。

この問題を解決するアルゴリズムはありますか?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);

画像のラプラシアンは次のようになります。 ラプラシアン

このアプローチのパラメーターを最適化してから、4つのセクションの境界を補間しようとします。


5
信号処理はユーロゲーミングに適合しています。私のオタク感覚がチクチクする!
nispio

1
常に同じサイズのボードを使用しており、画像内のボードのビューが常にほぼ同じである場合は、サイズと登録を決定するためにボードの輪郭を認識するだけで問題を解決できる可能性があります。タイルの配置とサイズはボードの端に対して一定です。したがって、すべての端がどこにあるかがわかれば、内側のタイルの位置を正確に推測できるはずです。
nispio

@nispio、ご提案ありがとうございます。ボードのサイズは常に同じですが、ボードの表示はかなり変わる可能性があります。背景の色も他の写真とは異なるため、コントラストがはるかに低くなります。たとえば、背景がベージュの場合、アウトラインの位置を判断するのは困難です。
snalx

1
他の回答が得られない場合は、自分の質問に対する回答として編集内容を投稿することをお勧めします。しかし、それが賞金とどのように相互作用するのか分かりません!
lmjohns3

1
@snalx:調査結果を回答として投稿した場合、私はあなたに賞金を授与します。ただし、今後12時間以内に行う必要があります。
1月

回答:


6

第一のアプローチ:

このチュートリアルhttp://note.sonots.com/SciSoftware/haartraining.htmlに従ってopencvのhaartrainingメソッドを使用してください-これで最良の結果が得られるはずですが、これまで自分でhaartrainingを行ったことはありません...

第二のアプローチ:

ボードの個々のタイルを「マーカーレストラッキング」する方法を使用することをお勧めします。OpenCVを使用してこれを実装することもできます。

準備

  1. このためには、各タイプのタイルの写真が必要です。画像の中央にあるトップダウンビュータイルからの均一な背景で、すべてのタイルタイプ(それぞれを1つの画像として)の写真を撮ります。

  2. 次に、いくつかの特徴検出器(OpenCVには複数のアルゴリズムがありますが、SIFT / SURFは非フリーアルゴリズムです。「FAST」を使用することをお勧めします)を使用して、画像内の特徴的なポイントを見つけます。

  3. 機能記述子を使用して、画像で見つかった機能を説明します(「BRIEF」などを使用)。

検出

この画像に同じ特徴検出器/記述子アルゴリズムを適用することで、画像内のタイルを検出できるようになりました。機能/記述子を取得したら、FlannBasedMatcherを適用してタイルを見つけることができます。

OpenCVのコード例/チュートリアルは次のとおりです。http//docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html#feature-homography

ノート

マッチャーメソッドでは、一致するものは1つだけであり、ボード上にそのタイプのタイルが複数ある場合は問題が発生する可能性があります。入力画像の一部のみをマスクすることで、この問題を回避できます。検出された特徴のピクセル座標を使用してこれを行うことをお勧めします。どういうわけか、最初にタイルの輪郭とサイズを検出した場合、画像上のタイルの位置とサイズを大まかに推定できます。一致する前に、検出された機能リスト(たとえば、タイルの予想中点から半径xピクセル内の機能のみ)をフィルター処理してから、最も強い一致を使用します。その結果、画像上のタイルの正確な位置(方向を含む)が与えられます。地図の輪郭を検出するのが複雑すぎる場合は、ユーザーがコーナータイルを「ポイント」して、輪郭を手動でマークすることができます...

代替アプローチ

このメソッドを使用して、アウトラインでタイルを検索することもできます。画像のないタイル(六角形)のサンプル「概略」グレースケール画像を描画します。この画像の「暗い」領域と「明るい」領域は、いくつかの「線」だけでなく、回路図で正しい必要があることに注意してください。おそらくこれを試してみる必要があるでしょう。異なるタイルの複数の写真を平均して、タイルの「平均」画像を生成できます。コーナーが同じ位置にあることを確認し(それに応じて画像を移動/拡大縮小します)、終了したら画像をシャープにし(明確なコーナー/エッジが見えるはずです)、必要に応じてコントラストを少し調整します。


@StefanKのご提案ありがとうございます。ゲームのピース(家)がタイルの上にある場合、最初と2番目のアプローチがまだ機能するかどうか少し心配です。あなたの代替アプローチは有望に見えますが、私はそれを試してみます(おそらく前処理を少し行った後)。
snalx

ほとんどの場合、外側の線の検出は可能と思われます。私は最近、私の質問の最終結果に似た画像でHoughトランスフォームでそれを試しました。安定したソリューションが見つかったら、質問を更新します。
snalx

タイル上の家や他のゲームのピースは問題になりません。これにより、いくつかの「機能」がカバーされますが、それらの一部はまだ検出されます。少なくとも4つが検出可能である必要があります。
opencv

3

ゲームルールの活用、画像処理、特徴検出の組み合わせである現在のアプローチについて説明します。

関連するゲームルール

実現

最初に、ハフ変換を使用してゲームボードの位置を抽出します。ソース画像は問題の最終画像に似ていますが、線が太くなり、小さな境界線がフィルタリングされます。私は、非常に長い線(大きさのオーダー:画像の幅/高さの約60%)と、線の一致の非常に小さなしきい値のみを検出します。また、画像の外側の40%の線を見て、検出された線の中央値を上下、左右に取ります。結果は以下の画像に示されています: ハフ変換

大まかな近似が必要なだけなので、これで十分です。これからは、ハフライン内の画像と、ハフ変換の不確実性による余分なスペースのみを調べます。

次に、Stefan K.の回答で提案されている特徴検出を使用して、プレイヤーが撮影できない画像、つまり城、ロケーションタイル、山などの特徴を検出します。opencv-pythonでORBアルゴリズムを使用してそれを実行し、BruteForce-Hamming-Matcherを使用します(FlannBasedマッチャーを実行できませんでした)。ORBはスケールと回転に不変です。同じ機能(城など)の複数の発生を検出するために、重複する部分に画像を分割します。これは、長い画像解像度が十分に大きく、写真が上から直接撮影されるため、正常に機能します(テストが必要です)。また、一種の遅いです。ロケーションタイル(居酒屋)の検出を下の画像の例として示します 城の特徴検出

現時点では、homographyTransformを見つけて、検出された特徴の正確な位置と方向を抽出しようとしています。

この情報(山、城、ロケーションタイル、ほとんどの場合は水の位置)からグリッドを再構築できることを願っています。現在の実験は有望に見えますが、特徴画像の多くの微調整と適切な準備が必要です。


カタンで似たようなことをしましたが、ホログラフィーの代わりに、任意のタイルに平均色値を使用しています。前処理でタイルを6面ポリゴン輪郭として識別し、エッジを分離し、そのROIをマスクに変換してから、bitwise_andでマスクをソースイメージに適用します。次に、ほとんどのタイルを識別するのに十分な平均色を取得し、追加のパターンマッチングを実行できます。私はこれを始めたばかりです: youtube.com/watch
レックスハーディン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.