Làm thế nào để nhận biết ốp lát hình lục giác trong boardgame?


16

Tôi muốn nhận ra ranh giới của một hình lục giác trong một bức ảnh, như trong hình dưới đây:

nhập mô tả hình ảnh ở đây

Dường như đối với tôi, một cách tiếp cận tiêu chuẩn ở lưới ô vuông là trước tiên phát hiện các góc (ví dụ canny) và sau đó trích xuất các dòng dài nhất thông qua một biến đổi Hough hoặc một cái gì đó tương tự.

Đây không phải là giải pháp tối ưu với ốp lát hex, bởi vì độ dài của các đường bên ngoài ngắn hơn và thật khó để tách chúng khỏi các đường khác.

Có bất kỳ thuật toán để giải quyết vấn đề này? Sẽ rất tốt nếu có một giải pháp trong opencv, nhưng tôi cũng quan tâm đến những ý tưởng chung.

cập nhật:

Với python và opencv tôi đã có thể nhận được kết quả này: đường viền

Đây là mã của tôi:

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 của hình ảnh trông giống như: laplacian

Tôi sẽ cố gắng tối ưu hóa các tham số của phương pháp này và sau đó cố gắng nội suy các ranh giới của bốn phần.


5
Xử lý tín hiệu đáp ứng trò chơi euro; các giác quan của tôi đang nhói lên!
nispio

1
Nếu bạn luôn sử dụng bảng có cùng kích thước và sẽ luôn có cùng một góc nhìn của bảng trong ảnh, thì bạn có thể giải quyết vấn đề đơn giản như nhận ra đường viền của bảng để xác định kích thước và đăng ký. Việc đặt và kích thước của gạch không đổi đối với các cạnh của bảng, vì vậy một khi bạn biết tất cả các cạnh của mình ở đâu, bạn sẽ có thể suy ra chính xác các vị trí của gạch bên trong.
nispio

Cảm ơn bạn đã gợi ý của bạn, @nispio. Kích thước bảng luôn giống nhau, trong khi giao diện của bảng có thể thay đổi khá nhiều. Màu sắc của nền cũng khác nhau trong các bức ảnh khác, dẫn đến độ tương phản thấp hơn nhiều. Nếu nền là màu be chẳng hạn, vị trí của phác thảo là khó xác định.
snalx

1
Nếu bạn không nhận được bất kỳ câu trả lời nào khác, tôi nghĩ rằng đó là một ý tưởng tốt để đăng các chỉnh sửa của bạn như là một câu trả lời cho câu hỏi của riêng bạn. Tôi không chắc làm thế nào mà tương tác với tiền thưởng mặc dù!
lmjohns3

1
@snalx: Nếu bạn đăng phát hiện của bạn dưới dạng câu trả lời, tôi sẽ trao phần thưởng cho bạn. Cần phải được thực hiện trong 12 giờ tới.
Tháng Một

Câu trả lời:


6

Cách tiếp cận thứ 1:

Sử dụng các phương pháp haartraining của opencv theo hướng dẫn này http://note.sonots.com/SciSoftware/haartraining.html - điều này sẽ cho kết quả tốt nhất, nhưng cho đến nay tôi vẫn chưa làm việc với haartraining

Cách tiếp cận thứ 2:

Tôi sẽ đề nghị sử dụng các phương pháp "theo dõi không đánh dấu" của các ô riêng lẻ của bảng. Bạn cũng có thể thực hiện điều này bằng OpenCV ..

Sự chuẩn bị

  1. Đối với mục đích này, bạn sẽ cần một số hình ảnh của từng loại gạch. Chụp ảnh tất cả các loại gạch (mỗi loại là một hình ảnh), với nền đồng nhất từ ​​ô nhìn từ trên xuống ở giữa ảnh.

  2. Sau đó, sử dụng một số trình phát hiện tính năng (OpenCV có nhiều thuật toán cho việc này, nhưng SIFT / SURF là các thuật toán không miễn phí; tôi khuyên bạn nên sử dụng "NHANH CHÓNG") để tìm các điểm khác biệt trong ảnh.

  3. Sử dụng một mô tả tính năng để mô tả tính năng được tìm thấy trong hình ảnh (sử dụng ví dụ "BRIEF").

Phát hiện

Bây giờ bạn có thể phát hiện các ô trong một hình ảnh bằng cách áp dụng các thuật toán dò / mô tả tính năng tương tự cho hình ảnh này. Khi bạn đã có được các tính năng / mô tả, bạn có thể áp dụng FlannBasingMatcher để tìm các ô.

Đây là một ví dụ mã / hướng dẫn từ OpenCV: http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html#feature-homography

Ghi chú

Phương thức đối sánh sẽ chỉ cung cấp cho bạn một kết quả khớp và có thể có vấn đề nếu có nhiều hơn một ô loại đó được tìm thấy trên bảng. Bạn có thể giải quyết vấn đề đó bằng cách chỉ che giấu một số phần của hình ảnh đầu vào. Tôi đề nghị làm điều này bằng cách sử dụng tọa độ pixel của các tính năng được phát hiện. Nếu bạn - bằng cách nào đó - phát hiện đường viền và kích thước của gạch trước, bạn có thể ước tính gần đúng vị trí và kích thước của gạch trên ảnh. Lọc danh sách tính năng được phát hiện của bạn (ví dụ: chỉ các tính năng trong bán kính x pixel từ điểm giữa dự kiến ​​của ô xếp) trước khi khớp và sau đó sử dụng kết quả khớp mạnh nhất. Kết quả là bạn sẽ được cung cấp vị trí chính xác của ô trên hình ảnh (bao gồm cả hướng của nó). Nếu quá phức tạp để phát hiện phác thảo bản đồ, bạn có thể để người dùng "trỏ" vào các ô góc để đánh dấu phác thảo bằng tay ...

Cách tiếp cận khác

Bạn cũng có thể sử dụng phương pháp này để tìm bất kỳ gạch nào theo phác thảo của nó. Vẽ một bức tranh thang độ xám "sơ đồ" mẫu của một ô (hình lục giác) mà không có bất kỳ hình ảnh nào trên đó. Lưu ý rằng các vùng "tối" và "sáng" trong hình ảnh này cần phải chính xác trong sơ đồ, không chỉ một số "đường". Có lẽ bạn sẽ cần phải thử nghiệm điều này. Bạn có thể thử lấy trung bình nhiều ảnh của các ô khác nhau để tạo ảnh "trung bình" của ô. Đảm bảo các góc ở cùng một vị trí (di chuyển / chia tỷ lệ hình ảnh phù hợp) và làm sắc nét hình ảnh khi hoàn thành (có thể nhìn thấy các góc / cạnh rõ ràng) và điều chỉnh độ tương phản một chút, nếu cần.


Cảm ơn lời đề nghị của bạn @StefanK. Tôi hơi lo lắng nếu cách tiếp cận thứ nhất và thứ hai vẫn hoạt động nếu các phần chơi trò chơi (nhà) nằm trên gạch. Cách tiếp cận thay thế của bạn có vẻ hứa hẹn, tôi sẽ thử điều đó (có thể sau một chút tiền xử lý).
snalx

Việc phát hiện các đường bên ngoài dường như là có thể trong hầu hết các trường hợp. Gần đây tôi đã thử điều đó với Hough transfom trên các hình ảnh tương tự như kết quả cuối cùng trong câu hỏi của tôi. Tôi sẽ cập nhật câu hỏi của tôi khi tôi tìm thấy một giải pháp ổn định.
snalx

Nhà và các phần trò chơi khác trên gạch không phải là một vấn đề. Điều này khiến một số "tính năng" được bảo hiểm, nhưng một số trong số chúng vẫn sẽ được phát hiện. Ít nhất 4 cần phải được phát hiện. Bạn có thể thử các bản phát hiện tính năng của opencv và xem có bao nhiêu tính năng được phát hiện trên mỗi ô ...
SDwarfs

3

Tôi sẽ mô tả cách tiếp cận hiện tại của tôi, đó là sự kết hợp của việc khai thác các quy tắc trò chơi, xử lý hình ảnh và phát hiện tính năng.

Luật chơi có liên quan

Hiện thực hóa

Đầu tiên tôi sử dụng biến đổi Hough để trích xuất vị trí của bảng trò chơi. Hình ảnh nguồn trông tương tự như hình ảnh cuối cùng trong câu hỏi, nhưng với các dòng dày hơn và tôi đã lọc các ranh giới nhỏ hơn. Tôi chỉ sử dụng phát hiện các dòng rất dài (thứ tự cường độ: khoảng 60 phần trăm chiều rộng / chiều cao của hình ảnh) và ngưỡng rất nhỏ để khớp dòng. Tôi cũng chỉ nhìn vào các dòng ở 40 phần trăm bên ngoài của hình ảnh và lấy trung bình của các dòng được phát hiện ở trên cùng, dưới cùng, bên trái và bên phải. Kết quả được hiển thị trong hình dưới đây: Biến đổi

Tôi chỉ cần một xấp xỉ thô, vì vậy điều này là tốt. Từ giờ tôi chỉ kiểm tra hình ảnh bên trong Houghlines, cộng với một số không gian thừa do sự không chắc chắn của biến đổi Hough.

Sau đó, tôi sử dụng tính năng phát hiện tính năng, như đề xuất của Stefan K. trong câu trả lời của anh ấy, để phát hiện các tính năng trong hình ảnh, mà người chơi không thể thực hiện, ví dụ như lâu đài, gạch vị trí và núi. Tôi sử dụng thuật toán ORB trong opencv-python để làm điều đó và BruteForce-Hamming-Matcher (Tôi vẫn chưa thể chạy trình so khớp FlannBasing). ORB là quy mô và bất biến xoay vòng. Để phát hiện nhiều lần xuất hiện của cùng một tính năng (ví dụ: lâu đài) tôi chia hình ảnh thành nhiều phần, chồng chéo lên nhau. Điều này hoạt động tốt khi độ phân giải hình ảnh dài là đủ lớn và hình ảnh được chụp trực tiếp từ đầu (vẫn cần một số thử nghiệm). Nó cũng là loại chậm. Phát hiện ô vị trí (quán rượu) được hiển thị như một ví dụ trong hình ảnh bên dưới phát hiện tính năng lâu đài

Hiện tại tôi cố gắng tìm homographyTransform để trích xuất vị trí và hướng chính xác của các tính năng được phát hiện.

Tôi hy vọng có thể tái tạo lại lưới điện từ thông tin này (vị trí của núi, lâu đài, gạch vị trí và trong hầu hết các trường hợp là nước). Các thí nghiệm dòng điện trông có vẻ đầy hứa hẹn, mặc dù rất nhiều tinh chỉnh và chuẩn bị đúng hình ảnh tính năng phải được thực hiện.


Tôi đã làm một cái gì đó tương tự với Catan nhưng thay vì hoomography tôi đang sử dụng giá trị màu trung bình cho bất kỳ ô cụ thể nào. Xác định gạch là một đường viền poly 6 mặt với quá trình tiền xử lý để giúp cách ly các cạnh, sau đó chuyển ROI đó thành mặt nạ, sau đó áp dụng mặt nạ với bitwise_and trên ảnh nguồn. Sau đó, bạn có thể nhận được màu trung bình, có thể đủ để xác định hầu hết các ô và sau đó bạn có thể thực hiện khớp mẫu bổ sung. Tôi mới bắt đầu cái này: youtube.com/watch?v=0ezfyWkio6c
Rex Hardin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.