Saya ingin mengenali batas - batas ubin heksagonal dalam foto, seperti pada gambar di bawah ini:
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:
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:
Saya akan mencoba untuk memilih parameter dari pendekatan ini dan kemudian mencoba untuk menginterpolasi batas dari empat bagian.
Jawaban:
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
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.
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.
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.
sumber
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:
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
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.
sumber