Boardgame'de altıgen fayans nasıl tanınır?


16

Aşağıdaki resimde olduğu gibi bir fotoğraftaki altıgen döşemenin sınırlarını tanımak istiyorum:

resim açıklamasını buraya girin

Bana öyle geliyor ki, kare bir ızgarada standart bir yaklaşım, önce köşeleri (örn. Kutu) tespit etmek ve daha sonra en uzun çizgileri bir Hough dönüşümü veya benzeri bir şeyle çıkarmaktır .

Bu, altıgen döşemeyle en uygun çözüm olarak görünmemektedir, çünkü dış hatların uzunluğu daha kısadır ve bunları diğer hatlardan ayırmak zordur.

Bu sorunu çözmek için herhangi bir algoritma var mı? Opencv'de bir çözüme sahip olmak özellikle güzel olurdu, ancak genel fikirlerle de ilgileniyorum.

Güncelleme:

Python ve opencv ile bu sonucu alabildim: konturlar

İşte benim kod:

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);

Resmin Laplacian'ı şuna benzer: laplacian

Bu yaklaşımın parametrelerini optimize etmeye çalışacağım ve daha sonra dört bölümün sınırlarını enterpolasyon etmeye çalışacağım.


5
Sinyal işleme euro-gaming ile buluşuyor; benim geek duyuları karıncalanma!
nispio

1
Her zaman aynı boyutta kart kullanıyorsanız ve görüntüde her zaman kabaca aynı görünüme sahip olacaksanız, sorunu boyutlandırma ve kaydı belirlemek için kartın ana hatlarını tanımak kadar çözebilirsiniz. Fayansların yerleştirilmesi ve boyutlandırılması tahtanın kenarlarına göre sabittir, bu nedenle tüm kenarlarınızın nerede olduğunu bildiğinizde, iç karoların pozisyonlarını doğru bir şekilde çıkarabilirsiniz.
nispio

Önerin için teşekkürler, @nispio. Kartın boyutu her zaman aynıdır, oysa kartın görünümü biraz değişebilir. Arka planın rengi de diğer resimlerde farklıdır, bu da çok daha düşük bir kontrast sağlar. Arka plan bej ise, örneğin ana hattın konumunu belirlemek zordur.
snalx

1
Başka yanıt alamıyorsanız, düzenlemelerinizi kendi sorunuza yanıt olarak göndermenin iyi bir fikir olduğunu düşünüyorum. Ama bunun ödül ile nasıl etkileşime girdiğinden emin değilim!
lmjohns3

1
@snalx: Bulgularınızı cevap olarak gönderirseniz size ödül vereceğim. Yine de önümüzdeki 12 saat içinde yapılması gerekiyor.
Ocak

Yanıtlar:


6

1. Yaklaşım:

Bu öğreticiye göre opencv haartraining yöntemlerini kullanın http://note.sonots.com/SciSoftware/haartraining.html - bu en iyi sonuçları vermelidir, ancak şimdiye kadar kendimi haartraining ile çalışmadım ...

2. Yaklaşım:

Tahtanın her bir fayans "işaretsiz izleme" yöntemlerini kullanmanızı öneririm. Bunu OpenCV kullanarak da uygulayabilirsiniz.

Hazırlık

  1. Bu amaçla, her karo türünün bazı fotoğraflarına ihtiyacınız olacak. Resmin ortasındaki yukarıdan aşağıya görünüm döşemesinden homojen bir arka plana sahip tüm döşeme türlerinin (her biri bir resim olarak) fotoğrafını çekin.

  2. Sonra bazı özellik dedektörü kullanın (OpenCV bunun için birden fazla algoritmaya sahiptir, ancak SIFT / SURF serbest olmayan algoritmalardır; "HIZLI" kullanmanızı öneririm) resimlerdeki farklı noktaları bulmak için.

  3. Resimde bulunan özelliği tanımlamak için bir özellik tanımlayıcı kullanın (örn. "KISA" kullanın).

Tespit etme

Artık bu görüntüye aynı özellik detektör / tanımlayıcı algoritmalarını uygulayarak görüntüdeki döşemeleri algılayabilirsiniz. Özellikleri / tanımlayıcıları edindiğinizde, döşemeleri bulmak için FlannBasedMatcher'ı uygulayabilirsiniz.

İşte OpenCV'den bir kod örneği / öğretici: http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html#feature-homography

notlar

Eşleştirici Yöntemi size yalnızca bir eşleşme sağlar ve tahtada bu türden birden fazla döşeme varsa sorun yaşayacaktır. Giriş görüntüsünün yalnızca bazı bölümlerini maskeleyerek bu soruna geçici bir çözüm bulabilirsiniz. Bunu, algılanan özelliklerin piksel koordinatlarını kullanarak yapmanızı öneririm. İlk önce döşemelerin anahatlarını ve boyutlarını bir şekilde tespit ederseniz, resimdeki döşeme konumlarını ve boyutunu kabaca tahmin edebilirsiniz. Algılanan özellik listenizi filtreleyin (örneğin yalnızca döşemenin beklenen orta noktasından x piksel yarıçapındaki özellikler) ve ardından en güçlü eşleşmeyi kullanın. Sonuç olarak, döşemenin görüntüdeki tam konumu (yönü dahil) verilir. Harita taslağını algılamak çok karmaşıksa, kullanıcının taslağı manuel olarak işaretlemesi için köşe döşemelerinde "işaret etmesine" izin verebilirsiniz ...

Alternatif yaklaşım

Bu yöntemi ayrıca, döşemelerin anahatlarından herhangi birini bulmak için de kullanabilirsiniz. Üzerinde herhangi bir resim olmadan bir karonun (altıgen) örnek bir "şematik" gri tonlamalı resmini çizin. Bu görüntüdeki "karanlık" ve "aydınlık" bölgelerin şematikte doğru olması gerektiğine dikkat edin, sadece bazı "çizgiler" değil. Muhtemelen bunu denemeniz gerekecek. Bir döşemenin "ortalama" görüntüsünü oluşturmak için farklı döşemelerin birden fazla fotoğrafını ortalamayı deneyebilirsiniz. Köşelerin aynı konumda olduğundan emin olun (resimleri buna göre hareket ettirin / ölçeklendirin) ve bittiğinde resmi netleştirin (net köşeler / kenarlar görünür olmalıdır) ve gerekirse kontrastı biraz ayarlayın.


Öneri için teşekkürler @StefanK. Oyun parçaları (evler) fayansların üzerinde duruyorsa, birinci ve ikinci yaklaşım hala işe yarıyorsa biraz endişeliyim. Alternatif yaklaşımınız umut verici görünüyor, bunu deneyeceğim (belki biraz önişlemeden sonra).
snalx

Dış hatların tespiti çoğu durumda mümkün görünmektedir. Son zamanlarda sorumun son sonucuna benzer görüntülerde Hough transfomuyla denedim. Kararlı bir çözüm bulduğumda sorumu güncelleyeceğim.
snalx

Fayanslardaki evler ve diğer oyun taşları sorun olmamalı. Bu, bazı "özelliklerin" kapsanmasına neden olur, ancak bazıları yine de algılanır. En az 4 tanesinin tespit edilebilmesi gerekir. Opencv'in özellik algılama demolarını deneyebilir ve her karoda kaç özellik tespit edildiğine bakabilirsiniz ...
SDwarfs

3

Oyun kurallarını, görüntü işlemeyi ve özellik algılamayı bir arada kullanan mevcut yaklaşımımı açıklayacağım.

İlgili oyun kuralları

gerçekleşme

İlk başta oyun tahtasının konumunu çıkarmak için Hough dönüşümünü kullanıyorum. Kaynak görüntü, söz konusu son görüntüye benzer, ancak daha kalın çizgilerle ve daha küçük sınırları filtreledim. Yalnızca çok uzun satırları (büyüklük sırası: görüntü genişliği / yüksekliğinin yaklaşık yüzde 60'ı) ve satır eşleşmesi için çok küçük eşiği tespit ediyorum. Ayrıca görüntünün dış yüzde 40'ındaki çizgilere de bakıyorum ve algılanan çizgilerin medyanını üst, alt, sol ve sağdan alıyorum. Sonuç aşağıdaki resimde gösterilmiştir: Hough dönüşümü

Sadece kaba bir yaklaşıma ihtiyacım var, bu yüzden bu iyi. Şu andan itibaren sadece Houghlines içindeki görüntüyü ve ayrıca Hough dönüşümünün belirsizliğinden dolayı fazladan alanı inceliyorum.

Ardından, Stefan K. tarafından yanıt olarak, görüntüdeki oyuncular, yani kaleler, yer karoları ve dağlar tarafından alınamayan özellikleri tespit etmek için özellik algılamayı kullanıyorum. Bunu yapmak için opencv-python ve BruteForce-Hamming-Matcher ORB algoritması (henüz FlannBased eşleştirici çalıştıramadım) kullanın. ORB ölçek ve rotasyonla değişmezdir. Aynı özelliklerin (örneğin kaleler) birden fazla oluşumunu tespit etmek için görüntüyü parçalar halinde bölerim, bu üst üste biner. Görüntü çözünürlüğü yeterince büyük olduğu ve resim doğrudan üstten çekildiği için bu iyi çalışıyor (yine de bazı testlere ihtiyaç var). Aynı zamanda yavaş. Yer döşemesinin (meyhane) algılanması aşağıdaki resimde örnek olarak gösterilmiştir kale özellik algılama

Şu anda, tespit edilen özelliklerin tam konumunu ve yönünü çıkarmak için homographyTransform'u bulmaya çalışıyorum.

Bu bilgiden (dağların konumu, kale, yer karoları ve çoğu durumda su) ızgarayı yeniden oluşturabileceğimi umuyorum. Akım deneyleri umut verici görünüyor, ancak çok sayıda ince ayar ve özellik görüntülerinin uygun şekilde hazırlanması gerekiyor.


Catan ile benzer bir şey yaptım ama hoomografi yerine verilen herhangi bir karo için ortalama renk değerini kullanıyorum. Döşemeyi, kenarları izole etmeye yardımcı olmak için ön işleme ile 6 yüzlü poli kontur olarak tanımlayın, ardından bu YG'yi bir maskeye dönüştürün, ardından maskeyi bitwise_and ile kaynak görüntünün üzerine uygulayın. Daha sonra, çoğu döşemeyi tanımlamak için yeterli olabilecek ortalama renk elde edebilirsiniz ve daha sonra ek desen eşleştirmesi yapabilirsiniz. Ben yeni başladım: youtube.com/watch?v=0ezfyWkio6c
Rex Hardin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.