วิธีการจำการเรียงตัวหกเหลี่ยมในเกมกระดาน?


16

ฉันต้องการทราบขอบเขตของการเรียงต่อหกเหลี่ยมในภาพถ่ายเหมือนในภาพด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับฉันแล้วดูเหมือนว่าวิธีการมาตรฐานที่กริดสแควร์คือการตรวจจับมุม (เช่นแสนอร่อย) ก่อนแล้วจึงแยกเส้นที่ยาวที่สุดผ่านการแปลง Houghหรือสิ่งที่คล้ายกัน

นี่ไม่ใช่วิธีที่ดีที่สุดในการปูกระเบื้องด้วยเลขฐานสิบหกเนื่องจากความยาวของเส้นด้านนอกสั้นกว่าและเป็นการยากที่จะแยกพวกมันออกจากเส้นอื่น

มีอัลกอริธึมที่จะแก้ไขปัญหานี้หรือไม่? มันเป็นเรื่องดีที่จะมีทางออกใน 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);

Laplacian ของภาพดูเหมือนว่า: Laplacian

ฉันจะพยายามปรับพารามิเตอร์ของวิธีการนี้ให้ดีที่สุดแล้วลองปรับเปลี่ยนขอบเขตของส่วนทั้งสี่


5
การประมวลผลสัญญาณตรงกับการเล่นเกมยูโร ความรู้สึกที่เกินบรรยายของฉันรู้สึกเสียวซ่า!
nispio

1
หากคุณใช้บอร์ดขนาดเดียวกันอยู่เสมอและจะมีมุมมองที่เหมือนกันกับบอร์ดในรูปภาพเสมอคุณอาจสามารถแก้ปัญหาได้เช่นเดียวกับการจดจำโครงร่างของบอร์ดเพื่อกำหนดขนาดและการลงทะเบียน การวางและปรับขนาดของกระเบื้องนั้นคงที่ตามขอบของบอร์ดดังนั้นเมื่อคุณรู้ว่าขอบทั้งหมดของคุณอยู่ที่ไหนคุณควรจะสามารถอนุมานตำแหน่งของกระเบื้องภายในได้อย่างแม่นยำ
nispio

ขอบคุณสำหรับคำแนะนำของคุณ @nispio ขนาดกระดานเหมือนกันตลอดเวลาในขณะที่มุมมองของคณะกรรมการอาจมีการเปลี่ยนแปลงเล็กน้อย สีของพื้นหลังก็แตกต่างกันไปในรูปภาพอื่นซึ่งนำไปสู่ความคมชัดต่ำกว่ามาก หากพื้นหลังเป็นสีเบจเช่นตำแหน่งของโครงร่างนั้นยากต่อการพิจารณา
snalx

1
หากคุณไม่ได้รับคำตอบอื่น ๆ ฉันคิดว่าเป็นความคิดที่ดีที่จะโพสต์การแก้ไขของคุณเป็นคำตอบสำหรับคำถามของคุณเอง ฉันไม่แน่ใจว่าวิธีการโต้ตอบกับเงินรางวัลแม้ว่า!
lmjohns3

1
@snalx: หากคุณโพสต์สิ่งที่คุณค้นพบเป็นคำตอบฉันจะให้รางวัลแก่คุณ ต้องทำในอีก 12 ชั่วโมงข้างหน้า
ม.ค.

คำตอบ:


6

วิธีที่ 1:

ใช้วิธีการ haartraining ของ opencv ตามแบบฝึกหัดนี้http://note.sonots.com/SciSoftware/haartraining.html - สิ่งนี้ควรให้ผลลัพธ์ที่ดีที่สุด แต่ฉันไม่ได้ทำงานด้วย haartraining ด้วยตัวเองจนถึงตอนนี้ ...

วิธีที่ 2:

ฉันขอแนะนำให้ใช้วิธีการ "ติดตามโดยไม่มีเครื่องหมาย" ของไพ่แต่ละใบของกระดาน คุณสามารถใช้สิ่งนี้โดยใช้ 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-pixel จากจุดกึ่งกลางที่คาดหวังของกระเบื้อง) ก่อนการจับคู่จากนั้นใช้การจับคู่ที่แข็งแกร่งที่สุด ดังนั้นคุณจะได้ตำแหน่งที่แน่นอนของไทล์บนรูปภาพ (รวมถึงการวางแนว) หากมันซับซ้อนเกินไปที่จะตรวจจับร่างแผนที่คุณสามารถให้ผู้ใช้ "ชี้" ที่มุมเรียงแผนที่เพื่อทำเครื่องหมายร่างด้วยตนเอง ...

วิธีการทางเลือก

นอกจากนี้คุณยังสามารถใช้วิธีนี้เพื่อค้นหารายการใดก็ได้ตามเค้าร่าง วาดตัวอย่าง "แผนผัง" ระดับสีเทาของกระเบื้อง (รูปหกเหลี่ยม) โดยไม่มีรูปภาพใด ๆ โปรดทราบว่าภูมิภาค "มืด" และ "แสง" ในภาพนี้จำเป็นต้องถูกต้องในแผนผังไม่ใช่แค่ "เส้น" บางเส้น คุณอาจต้องทดลองทำสิ่งนี้ คุณสามารถลองเฉลี่ยภาพถ่ายหลายภาพของไทล์ที่ต่างกันเพื่อสร้างภาพ "เฉลี่ย" ของไทล์ ตรวจสอบให้แน่ใจว่ามุมอยู่ในตำแหน่งเดียวกัน (เลื่อน / ปรับขนาดภาพตามลำดับ) และปรับความคมชัดของภาพเมื่อเสร็จแล้ว (ควรมองเห็นมุม / ขอบที่ชัดเจน) และปรับความคมชัดเล็กน้อยหากจำเป็น


ขอบคุณสำหรับคำแนะนำของคุณ @StefanK ฉันกังวลเล็กน้อยถ้าวิธีแรกและวิธีที่สองยังคงใช้ได้ถ้าชิ้นเกม (บ้าน) นอนอยู่บนแผ่นกระเบื้อง วิธีอื่นของคุณดูดีมากฉันจะลองดู (อาจหลังจากประมวลผลล่วงหน้าเล็กน้อย)
snalx

การตรวจจับของเส้นรอบนอกดูเหมือนจะเป็นไปได้ในกรณีส่วนใหญ่ ฉันเพิ่งลองสิ่งนั้นกับ Hough transfom บนภาพที่คล้ายกับผลลัพธ์สุดท้ายในคำถามของฉัน ฉันจะอัปเดตคำถามเมื่อพบโซลูชันที่เสถียร
snalx

เฮ้าส์และชิ้นเกมอื่น ๆ บนกระเบื้องไม่ควรมีปัญหา สิ่งนี้ทำให้ "คุณสมบัติ" บางอย่างได้รับการครอบคลุม แต่บางส่วนจะยังคงถูกตรวจพบ ต้องตรวจพบอย่างน้อย 4 ตัว คุณสามารถลองการสาธิตการตรวจจับคุณสมบัติของ opencv และดูว่ามีการตรวจจับคุณสมบัติมากมายในแต่ละ
ไท

3

ฉันจะอธิบายวิธีการปัจจุบันของฉันซึ่งเป็นการผสมผสานระหว่างการใช้ประโยชน์จากกฎของเกมการประมวลผลภาพและการตรวจจับคุณสมบัติ

กฎของเกมที่เกี่ยวข้อง

การสำนึก

ตอนแรกฉันใช้ Hough transform เพื่อแยกตำแหน่งของบอร์ดเกม รูปภาพต้นฉบับมีลักษณะคล้ายกับภาพสุดท้ายที่เป็นปัญหา แต่มีเส้นที่หนากว่าและฉันกรองขอบเขตที่เล็กลง ฉันใช้การตรวจจับเส้นที่ยาวมากเท่านั้น (ลำดับความสำคัญ: ประมาณ 60 เปอร์เซ็นต์ของความกว้าง / ความสูงของภาพ) และเกณฑ์ที่น้อยมากสำหรับการจับคู่เส้น ฉันก็แค่ดูเส้นที่ด้านนอก 40 เปอร์เซ็นต์ของภาพและใช้ค่ามัธยฐานของเส้นที่ตรวจพบที่ด้านบนด้านล่างซ้ายและขวา ผลลัพธ์จะแสดงในภาพด้านล่าง: Hough transform

ฉันต้องการการประมาณคร่าวๆเท่านั้นดังนั้นนี่ก็ใช้ได้ จากนี้ไปฉันตรวจสอบภาพภายใน Houghlines เท่านั้นรวมถึงพื้นที่เพิ่มเติมเนื่องจากความไม่แน่นอนของการแปลง Hough

จากนั้นฉันก็ใช้การตรวจจับคุณสมบัติตามที่ Stefan K. เสนอในคำตอบของเขาในการตรวจสอบคุณสมบัติในภาพที่ผู้เล่นไม่สามารถทำได้เช่นปราสาทกระเบื้องตำแหน่งและภูเขา ฉันใช้อัลกอริทึม ORB ใน opencv-python เพื่อทำเช่นนั้นและ BruteForce-Hamming-Matcher (ฉันยังไม่สามารถเรียกใช้ FlannBased matcher ได้) ORB คือค่าคงที่และการหมุน เพื่อตรวจจับการเกิดขึ้นของคุณสมบัติเดียวกันหลายครั้ง (เช่นปราสาท) ฉันแบ่งภาพเป็นส่วน ๆ ซึ่งซ้อนทับกัน วิธีนี้ใช้งานได้ดีเนื่องจากความละเอียดของภาพที่ยาวนานมีขนาดใหญ่พอและถ่ายจากด้านบนโดยตรง (ยังต้องการการทดสอบบางอย่าง) มันก็ช้าเหมือนกัน การตรวจหาไทล์ตำแหน่ง (โรงเตี๊ยม) แสดงเป็นตัวอย่างในภาพด้านล่าง การตรวจจับคุณสมบัติปราสาท

ในขณะนี้ฉันพยายามค้นหา homographyTransform เพื่อแยกตำแหน่งและทิศทางของฟีเจอร์ที่ตรวจพบ

ฉันหวังว่าจะสามารถสร้างตารางใหม่จากข้อมูลนี้ (ตำแหน่งของภูเขาปราสาทกระเบื้องตำแหน่งและในกรณีส่วนใหญ่น้ำ) การทดลองของกระแสน้ำดูมีแนวโน้มแม้ว่าจะต้องมีการปรับแต่งมากมายและการเตรียมภาพคุณลักษณะที่เหมาะสม


ฉันได้ทำสิ่งที่คล้ายกับ Catan แต่แทนที่จะใช้วิชาภูมิหลังที่ฉันใช้ค่าสีเฉลี่ยสำหรับกระเบื้องใด ๆ ระบุกระเบื้องเป็นรูปทรงโพลี 6 หน้าด้วยการประมวลผลล่วงหน้าเพื่อช่วยแยกขอบแล้วแปลง ROI นั้นให้เป็นรูปแบบหน้ากากจากนั้นใช้รูปแบบหน้ากากด้วย bitwise_and บนรูปภาพต้นฉบับ จากนั้นคุณจะได้สีที่พอเหมาะซึ่งอาจเพียงพอที่จะระบุไทล์ส่วนใหญ่แล้วคุณสามารถทำการจับคู่รูปแบบเพิ่มเติมได้ ฉันเพิ่งเริ่มต้นนี้: youtube.com/watch?v=0ezfyWkio6c
Rex Hardin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.