Bagaimana cara mengenali ubin heksagonal di boardgame?

16

Saya ingin mengenali batas - batas ubin heksagonal dalam foto, seperti pada gambar di bawah ini:

masukkan deskripsi gambar di sini

Sepertinya saya, bahwa pendekatan standar pada kotak persegi adalah pertama-tama mendeteksi sudut (misalnya cerdik) dan kemudian mengekstrak garis terpanjang melalui transformasi Hough atau yang serupa.

Ini tidak terlihat sebagai solusi optimal dengan hex tiling, karena panjang garis luar lebih pendek dan sulit untuk memisahkannya dari garis lain.

Apakah ada algoritma untuk mengatasi masalah ini? Terutama menyenangkan untuk memiliki solusi dalam OpenCV, tetapi saya juga tertarik pada ide-ide umum.

memperbarui:

Dengan python dan opencv saya dapat menerima hasil ini: kontur

Ini kode saya:

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

Laplacian gambar terlihat seperti: laplacian

Saya akan mencoba untuk memilih parameter dari pendekatan ini dan kemudian mencoba untuk menginterpolasi batas dari empat bagian.

snalx
sumber
5
Pemrosesan sinyal memenuhi euro-gaming; indera geek saya kesemutan!
nispio
1
Jika Anda selalu menggunakan papan ukuran yang sama, dan akan selalu memiliki tampilan papan yang kira-kira sama pada gambar, maka Anda mungkin dapat menyelesaikan masalah hanya dengan mengenali garis besar papan untuk menentukan ukuran dan pendaftaran. Penempatan dan ukuran ubin konstan terhadap tepi papan, jadi setelah Anda tahu di mana semua tepi Anda berada, Anda harus dapat menyimpulkan posisi ubin bagian dalam secara akurat.
nispio
Terima kasih atas saran Anda, @nispio. Ukuran papan sama sepanjang waktu, sedangkan tampilan papan mungkin sedikit berubah. Warna latar belakang juga berbeda pada gambar lain, yang mengarah ke kontras yang jauh lebih rendah. Jika latar belakangnya beige misalnya posisi garis besar sulit ditentukan.
snalx
1
Jika Anda tidak mendapatkan jawaban lain, saya pikir sebaiknya memposting hasil edit Anda sebagai jawaban atas pertanyaan Anda sendiri. Saya tidak yakin bagaimana itu berinteraksi dengan karunia itu!
lmjohns3
1
@snalx: Jika Anda memposting temuan Anda sebagai jawaban, saya akan memberikan hadiah kepada Anda. Namun, perlu dilakukan dalam 12 jam ke depan.
Januari

Jawaban:

6

Pendekatan 1:

Gunakan metode haartraining dari OpenCV sesuai dengan tutorial ini http://note.sonots.com/SciSoftware/haartraining.html - ini seharusnya memberikan hasil terbaik, tapi saya belum bekerja dengan haartraining sendiri sejauh ini ...

Pendekatan 2:

Saya akan menyarankan untuk menggunakan metode "pelacakan tanpa tanda" pada setiap ubin papan. Anda dapat mengimplementasikan ini menggunakan OpenCV juga ..

Persiapan

  1. Untuk keperluan ini, Anda memerlukan beberapa foto dari setiap jenis ubin. Ambil gambar dari semua jenis ubin (masing-masing sebagai satu gambar), dengan latar belakang homogen dari ubin tampilan atas-bawah di tengah gambar.

  2. Kemudian gunakan beberapa fitur detektor (OpenCV memiliki beberapa algoritma untuk ini, tetapi SIFT / SURF adalah algoritma yang tidak bebas; Saya akan menyarankan untuk menggunakan "FAST") untuk menemukan titik-titik khusus pada gambar.

  3. Gunakan deskriptor fitur untuk menggambarkan fitur yang ditemukan pada gambar (gunakan misalnya "SINGKAT").

Deteksi

Sekarang Anda dapat mendeteksi ubin dalam gambar dengan menerapkan algoritme detektor / deskripsi fitur yang sama untuk gambar ini. Ketika Anda telah memperoleh fitur / deskriptor, Anda dapat menerapkan FlannBasedMatcher untuk menemukan ubin.

Inilah contoh kode / tutorial dari OpenCV: http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html#feature-homography

Catatan

Metode Matcher hanya akan memberi Anda satu pertandingan dan mungkin akan memiliki masalah jika ada lebih dari satu ubin jenis yang ditemukan di papan tulis. Anda dapat mengatasi masalah itu dengan menutupi hanya beberapa bagian dari gambar input. Saya menyarankan untuk melakukan ini menggunakan koordinat piksel dari fitur yang terdeteksi. Jika Anda - entah bagaimana - mendeteksi garis dan ukuran ubin lebih dulu, Anda dapat memperkirakan posisi dan ukuran ubin pada gambar. Saring daftar fitur yang terdeteksi (mis. Hanya fitur dalam radius x-pixel dari titik tengah ubin yang diharapkan) sebelum mencocokkan dan kemudian menggunakan pencocokan terkuat. Akibatnya, Anda akan diberi posisi tepat ubin pada gambar (termasuk orientasinya). Jika terlalu rumit untuk mendeteksi garis besar peta, Anda dapat membiarkan pengguna "menunjuk" pada ubin sudut untuk menandai garis besar secara manual ...

Pendekatan alternatif

Anda juga dapat menggunakan metode ini untuk menemukan sembarang ubin berdasarkan garis besarnya. Gambar sampel grayscale "skematis" sampel ubin (segi enam) tanpa gambar di atasnya. Perhatikan bahwa wilayah "gelap" dan "terang" dalam gambar ini harus benar dalam skema, bukan hanya beberapa "garis". Anda mungkin perlu bereksperimen dengan ini. Anda dapat mencoba meratakan beberapa foto ubin yang berbeda untuk menghasilkan gambar "rata-rata" ubin. Pastikan sudut berada pada posisi yang sama (gambar bergerak / skala sesuai) dan pertajam gambar ketika selesai (sudut yang jelas / tepi harus terlihat) dan sesuaikan kontrasnya sedikit, jika perlu.

SDwarfs
sumber
Terima kasih atas saran Anda @StefanK. Saya sedikit khawatir jika pendekatan pertama dan kedua masih berfungsi jika potongan-potongan game (rumah) terletak di atas ubin. Pendekatan alternatif Anda terlihat menjanjikan, saya akan mencobanya (mungkin setelah sedikit preprocessing).
snalx
Deteksi garis luar tampaknya dimungkinkan dalam banyak kasus. Baru-baru ini saya mencobanya dengan Hough transfom pada gambar yang mirip dengan hasil akhir dalam pertanyaan saya. Saya akan memperbarui pertanyaan saya ketika saya menemukan solusi stabil.
snalx
Rumah dan potongan permainan lainnya di ubin seharusnya tidak menjadi masalah. Ini menyebabkan beberapa "fitur" dicakup, tetapi beberapa di antaranya masih akan terdeteksi. Setidaknya 4 harus terdeteksi. Anda dapat mencoba demo pendeteksian fitur OpenGL dan melihat berapa banyak fitur yang terdeteksi pada setiap ubin ...
SDwarfs
3

Saya akan menjelaskan pendekatan saya saat ini, yang merupakan kombinasi dari mengeksploitasi aturan permainan, pemrosesan gambar dan deteksi fitur.

Aturan permainan yang relevan

Realisasi

Pada awalnya saya menggunakan transformasi Hough untuk mengekstrak posisi papan permainan. Gambar sumber terlihat mirip dengan gambar akhir yang dipermasalahkan, tetapi dengan garis yang lebih tebal dan saya memfilter batas yang lebih kecil. Saya hanya menggunakan mendeteksi garis yang sangat panjang (urutan besarnya: sekitar 60 persen dari lebar / tinggi gambar) dan ambang yang sangat kecil untuk pencocokan garis. Saya juga hanya melihat garis di luar 40 persen gambar dan mengambil median garis yang terdeteksi di atas, bawah, kiri dan kanan. Hasilnya ditunjukkan pada gambar di bawah ini: Transformasi Hough

Saya hanya perlu perkiraan kasar, jadi ini tidak masalah. Mulai sekarang saya hanya memeriksa gambar di dalam Houghlines, ditambah beberapa ruang ekstra karena ketidakpastian transformasi Hough.

Kemudian saya menggunakan deteksi fitur, seperti yang diusulkan oleh Stefan K. dalam jawabannya, untuk mendeteksi fitur dalam gambar, yang tidak dapat diambil oleh para pemain, yaitu kastil, ubin lokasi, dan pegunungan. Saya menggunakan algoritma ORB di opencv-python untuk melakukan itu dan BruteForce-Hamming-Matcher (saya belum bisa menjalankan FlannBased matcher). ORB adalah skala dan rotasi invarian. Untuk mendeteksi beberapa kemunculan fitur yang sama (misalnya kastil) saya membagi gambar menjadi beberapa bagian, yang tumpang tindih. Ini berfungsi dengan baik karena resolusi gambar yang panjang cukup besar dan gambar diambil langsung dari atas (masih perlu beberapa tes). Ini juga agak lambat. Deteksi ubin lokasi (kedai) ditunjukkan sebagai contoh pada gambar di bawah ini deteksi fitur kastil

Saat ini saya mencoba mencari homographyTransform untuk mengekstrak posisi yang tepat dan orientasi fitur yang terdeteksi.

Saya berharap dapat merekonstruksi grid dari informasi ini (posisi gunung, kastil, ubin lokasi dan dalam banyak kasus air). Eksperimen arus tampak menjanjikan, meskipun banyak penyetelan yang bagus dan persiapan yang tepat dari gambar fitur harus dilakukan.

snalx
sumber
Saya telah melakukan sesuatu yang mirip dengan Catan tetapi alih-alih hoomografi saya menggunakan nilai warna rata-rata untuk setiap ubin yang diberikan. Identifikasi ubin sebagai kontur poli berwajah 6 dengan pra-pemrosesan untuk membantu mengisolasi ujung-ujungnya, lalu konversikan ROI itu menjadi mask, kemudian terapkan mask dengan bitwise_and di atas gambar sumber. Anda kemudian bisa mendapatkan warna rata-rata, yang mungkin cukup untuk mengidentifikasi sebagian besar ubin, dan kemudian Anda bisa melakukan pencocokan pola tambahan. Saya baru saja memulai ini: youtube.com/watch?v=0ezfyWkio6c
Rex Hardin