보드 게임에서 육각형 타일링을 인식하는 방법?


16

아래 이미지와 같이 사진에서 육각형 타일링경계 를 알고 싶습니다.

여기에 이미지 설명을 입력하십시오

정사각형 그리드에서 표준 접근 방식은 먼저 모서리 (예 : 캐니)를 감지 한 다음 Hough 변환 또는 이와 유사한 것을 통해 가장 긴 선을 추출하는 것 같습니다.

이것은 외부 타일의 길이가 짧고 다른 라인과 분리하기가 어렵 기 때문에 16 진 타일링에서 최적의 솔루션으로 보이지 않습니다.

이 문제를 해결하는 알고리즘이 있습니까? opencv에서 솔루션을 얻는 것이 특히 좋을 것이지만 일반적인 아이디어에도 관심이 있습니다.

최신 정보:

파이썬과 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);

이미지의 라플라시안은 다음과 같습니다. 라플라시안

이 방법의 매개 변수를 최적화 한 다음 네 섹션의 경계를 보간하려고합니다.


5
신호 처리는 유로 게임을 충족시킵니다. 내 괴짜 감각이 따끔 거린다!
nispio

1
항상 같은 크기의 보드를 사용하고 있으며 이미지에서 거의 같은 보드보기를 갖는 경우 보드의 윤곽을 인식하여 크기 및 등록을 결정하는 것만으로 문제를 해결할 수 있습니다. 타일의 배치 및 크기는 보드의 가장자리와 관련하여 일정하므로 모든 가장자리가 어디에 있는지 알게되면 내부 타일의 위치를 ​​정확하게 유추 할 수 있어야합니다.
nispio

귀하의 제안에 감사드립니다, @nispio. 보드 크기는 항상 동일하지만 보드의보기는 약간 변경 될 수 있습니다. 배경의 색상도 다른 사진에서 다르기 때문에 대비가 훨씬 낮아집니다. 예를 들어 배경이 베이지 색이면 외곽선의 위치를 ​​결정하기가 어렵습니다.
snalx

1
다른 답변을받지 못한 경우 수정 사항을 본인의 질문에 대한 답변으로 게시하는 것이 좋습니다. 그래도 현상금과 어떻게 상호 작용하는지 잘 모르겠습니다!
lmjohns3 3

1
@ snalx : 당신이 찾은 결과를 답변으로 게시하면 나는 당신에게 현상금을 수여합니다. 그러나 다음 12 시간 내에 완료해야합니다.
jan

답변:


6

첫 번째 접근법 :

이 튜토리얼 http://note.sonots.com/SciSoftware/haartraining.html 에 따라 opencv의 haartraining 방법을 사용하십시오. 이것은 최상의 결과를 제공해야하지만 지금까지 haartraining을 사용하지 않았습니다 ...

두 번째 접근법 :

보드의 개별 타일에 대한 "마커리스 추적"방법을 사용하는 것이 좋습니다. 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

노트

Matcher Method는 하나의 매치 만 제공하며 보드에 해당 유형의 타일이 두 개 이상있는 경우 문제가 발생할 수 있습니다. 입력 이미지의 일부만 마스킹하여이 문제를 해결할 수 있습니다. 감지 된 기능의 픽셀 좌표를 사용 하여이 작업을 수행하는 것이 좋습니다. 타일의 윤곽과 크기를 먼저 감지 한 경우 그림의 타일 위치와 크기를 대략적으로 추정 할 수 있습니다. 일치하기 전에 감지 된 기능 목록 (예 : 타일의 예상 중간 점에서 x 픽셀 반경 내에있는 기능 만)을 필터링 한 다음 가장 일치하는 항목을 사용하십시오. 결과적으로 이미지에서 타일의 정확한 위치가 표시됩니다 (방향 포함). 지도 외곽선을 감지하기가 너무 복잡한 경우 사용자가 모서리 타일을 "지점"으로 외곽선을 수동으로 표시 할 수 있습니다.

대체 접근법

이 방법을 사용하여 윤곽선으로 타일을 찾을 수도 있습니다. 타일 ​​(육각형)의 샘플 "도식"회색조 그림을 이미지없이 그립니다. 이 이미지의 "어두운"및 "밝은"영역은 일부 "선"이 아니라 회로도에서 정확해야합니다. 아마도 이것을 실험해야 할 것입니다. 다른 타일의 여러 사진을 평균화하여 타일의 "평균"이미지를 생성 할 수 있습니다. 모서리가 같은 위치에 있는지 확인하고 (그에 따라 사진을 이동 / 크기 조정) 완료되면 그림을 선명하게하고 (모서리가 뚜렷한 모서리 / 가장자리를 표시해야 함) 필요한 경우 대비를 약간 조정하십시오.


귀하의 제안에 감사드립니다 @StefanK. 게임 조각 (하우스)이 타일에 놓여 있으면 첫 번째와 두 번째 접근 방식이 여전히 작동하는지 조금 걱정입니다. 당신의 대안적인 접근 방식은 어리석은 것처럼 보일 것입니다.
snalx

대부분의 경우 외부 라인의 감지가 가능해 보입니다. 나는 최근에 내 질문의 최종 결과와 비슷한 이미지에서 Hough transfom으로 시도했습니다. 안정적인 솔루션을 찾으면 내 질문을 업데이트 할 것입니다.
snalx

타일에있는 집과 다른 게임 조각은 문제가되지 않습니다. 이로 인해 일부 "기능"이 다루어 지지만 일부는 여전히 감지됩니다. 4 개 이상을 감지 할 수 있어야합니다. opencv의 기능 감지 데모를 시도하고 각 타일에서 감지되는 기능 수를 확인할 수 있습니다.
SDwarfs

3

게임 규칙 활용, 이미지 처리 및 기능 감지의 조합 인 현재 접근 방식을 설명하겠습니다.

관련 게임 규칙

실현

처음에는 Hough 변형을 사용하여 게임 보드의 위치를 ​​추출합니다. 소스 이미지는 문제의 최종 이미지와 비슷하지만 더 두꺼운 선으로 더 작은 경계를 필터링했습니다. 나는 매우 긴 라인 (크기의 순서 : 이미지 너비 / 높이의 약 60 %)과 라인 일치를위한 매우 작은 임계 값 만 감지합니다. 또한 이미지의 바깥 쪽 40 %에서 선을보고 감지 된 선의 중앙값을 위, 아래, 왼쪽 및 오른쪽으로 가져옵니다. 결과는 아래 이미지에 나와 있습니다. 허프 변환

대략적인 근사치 만 필요하므로 괜찮습니다. 이제부터는 Houghlines 내부의 이미지와 Hough 변환의 불확실성으로 인한 추가 공간 만 검사합니다.

그런 다음 Stefan K.가 제안한 기능 감지 기능을 사용하여 이미지, 즉 성, 위치 타일 및 산에서는 사용할 수없는 기능을 감지합니다. opencv-python에서 ORB 알고리즘을 사용하여 BruteForce-Hamming-Matcher를 수행합니다 (FlannBased matcher를 아직 실행할 수 없었습니다). ORB는 스케일 및 회전 불변입니다. 동일한 지형지 ​​물 (예 : 성)의 여러 항목을 감지하기 위해 이미지가 부분적으로 분할되어 겹칩니다. 긴 이미지 해상도가 충분히 크고 사진을 위에서 직접 가져 오기 때문에 제대로 작동합니다 (여전히 테스트가 필요함). 또한 느리다. 위치 타일 (선술집) 감지는 아래 이미지에 예로 표시됩니다. 성 기능 탐지

현재 감지 된 피처의 정확한 위치와 방향을 추출하기 위해 homographyTransform을 찾으려고합니다.

나는이 정보 (산, 성, 위치 타일 및 대부분의 경우 물의 위치)에서 그리드를 재구성 할 수 있기를 바랍니다. 많은 미세 조정과 기능 이미지의 적절한 준비가 이루어져야하지만 현재 실험은 유망 해 보입니다.


Catan과 비슷한 작업을 수행했지만 Hoomography 대신 주어진 타일에 평균 색상 값을 사용하고 있습니다. 사전 처리를 통해 타일을 6면 폴리 윤곽으로 식별 한 다음 가장자리를 분리 한 다음 해당 ROI를 마스크로 변환 한 다음 소스 이미지에 bitwise_and로 마스크를 적용합니다. 그런 다음 평균 색상을 얻을 수 있으며, 이는 대부분의 타일을 식별하기에 충분할 수 있으며 추가 패턴 일치를 수행 할 수 있습니다. 방금 시작했습니다 : youtube.com/watch?v=0ezfyWkio6c
Rex Hardin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.