ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [퍼즐:09] 500조각 퍼즐 데이터 생성
    개발 2024. 1. 1. 12:54

     

    퍼즐 500 개 사진으로 데이터를 생성한다.

    데이터를 생성한 이후로는 이미지 처리를 할 필요가 없어진다.

    (맥으로 개발을 이어나갈 수 있다는 뜻..ㅋㅋ)

     

    데이터 처리는 두 단계로 나눠진다.

    1. 퍼즐 조각의 윤곽선과 코너를 인식하고 저장 (json)

    2. 퍼즐 윤곽선을 이용해 조각 간 연결 정보 생성

    윤곽선 저장

    윤곽선의 좌표를 정규화 해서 json으로 저장한다.

    윤곽선을 그대로 저장하는 것은 아니고, 꼭지점(corner)를 기반으로 모서리(edge)를 분리한 뒤 저장한다.

    모서리 정보에는 모서리 타입과 양쪽 꼭지점의 거리(모서리 길이)를 저장한다.

    타입은 헤드, 홀, 라인이라는 세가지 종류가 있다.

     

    윤곽선 정보는 좌표를 그냥 저장하지 않고 정규화해서 저장한다.

    정규화한다는 뜻은 양끝 꼭지점을 x 축으로 붙인다는 뜻.

    한 쪽 꼭지점을 (0, 0) 으로 옮기고, 다른 한 쪽을 (x, 0)으로 이동한다.

    이렇게 저장하면 다른 계산할 때 쉬워진다.

    그리고 홀 타입 퍼즐은 뒤집어서 저장한다. 마치 헤드 퍼즐 처럼. 나중에 계산하기 쉽도록.

     

    모서리 길이를 저장하는 것은 나중에 알고리즘의 성능을 개선하는데 큰 도움을 준다.

    나중에 모서리 간 유사도 검사 때 길이가 많이 차이나는 것은 윤곽선 비교를 할 필요가 없기 때문이다.

     

    데이터는 전반적으로 json의 형태 이지만, 배열이 너무 길어져서 직접 converter를 만들었다.

    PointFArrayJsonConverter

    {
      "Name": "puzzle_00001",
      "Corners": "[(154.000, 45.000), (359.000, 155.000), (238.000, 379.000), (29.000, 270.000)]",
      "Edges": [
        {
          "NormalizedPoints": "[(0.946, 1.762), (1.827, 1.290), (2.708, 0.817), ...]",
          "Length": 232.6478,
          "Type": "Head"
        },
        {
          "NormalizedPoints": "[(253.166, -2.640), (252.761, -1.284), ...]",
          "Length": 254.59183,
          "Type": "Hole"
        },
        {
          "NormalizedPoints": "[(-0.424, 1.349), (0.462, 0.887), (2.236, -0.038), ...]",
          "Length": 235.71593,
          "Type": "Head"
        },
        {
          "NormalizedPoints": "[(0.097, 2.234), (0.486, 0.874), (1.360, 0.389), ...]",
          "Length": 257.39075,
          "Type": "Line"
        }
      ]
    }

     

    윤곽선을 데이터로 저장하면 이미지 처리 작업은 전부 끝난다.

    opencv, emgucv 안녕~~

     

    퍼즐 연결 정보 생성

    퍼즐 500 개 간 연결 가능성이 있는 퍼즐을 찾는 작업.

    모든 모서리 정보를 서로 비교해가며 유사한 모서리를 저장한다.

    저장하는 요소는 퍼즐이름, 모서리 번호, 유사도이다.

     

    아래 데이터로 예를 들면 1번 퍼즐의 0번 모서리는 2번 퍼즐의 2번 모서리와 유사도 1.216을 가진다.

    유사도는 대체로 1 근처의 값이 좋다.

    나는 5 이하의 유사도를 모두 저장하긴 했지만 쓸모는 없었던 것 같다.

    나중에 500피스 다 맞춘 후 복기해보면 알듯

     

    당연하겠지만 퍼즐의 끝 조각 (모서리 조각)은 연결된 모서리가 없다.

     

    https://github.com/jkwchunjae/JigsawPuzzleAssistor/blob/main/MainProject/MainCli/ConnectInfoJson.cs

    https://github.com/jkwchunjae/JigsawPuzzleAssistor/blob/main/MainProject/Common/PieceInfo/EdgeInfo.cs#L28C41-L28C41

     

    {
      "PieceName": "puzzle_00001",
      "Edges": [
        {
          "Index": 0,
          "Connection": [
            "puzzle_00002, 2, 1.216",
            "puzzle_00102, 2, 1.884",
            ...
          ]
        },
        {
          "Index": 1,
          "Connection": [
            "puzzle_00192, 3, 0.877",
            "puzzle_00245, 2, 0.957",
            "puzzle_00178, 1, 0.987",
            ...
          ]
        },
        {
          "Index": 2,
          "Connection": [
            "puzzle_00299, 1, 1.173",
            "puzzle_00201, 0, 1.995",
            ...
          ]
        },
        {
          "Index": 3,
          "Connection": []
        }
      ]
    }

     

Designed by Tistory.