개발
-
[퍼즐:08] 500조각 꼭지점 수동 추출개발 2024. 1. 1. 12:38
윤곽선을 추출하는 방법은 아주 간단하다. 앞선 글에서 많이 다뤘다. 문제는 꼭지점(코너)를 검출하는 것이다. 코너를 제대로 검출하지 못했을 때 어떻게 할 것인가? 과거 나의 글 "퍼즐 조각 외곽선에서 코너 검출" 에서 보면 이런 말을 써놨다. 방법2: 코너를 30개 쯤 찾는다. 코너의 최소 거리를 짧게 10 정도. 찾아진 점들사이에서 내가 찾고 싶었던 점 4개를 찾는다. 방법1에서 원하는 점을 못 찾았을 때 방법2로 전환해서 점 4개를 찾을 계획 찾은 30개 점 중 가장 직사각형에 가까운 점 4개 조합을 찾으면 될 듯! 그런데 막상 구현하려고 보니 이렇게 해도 예외가 발생하면 어떻게 하지? 500 개를 돌려보니 코너를 찾지 못하는 경우는 약 20개 정도였다. 20개를 위해서 복잡한 구현을 하기 싫었다. ..
-
[퍼즐:07] 500조각 퍼즐 맞추기 (촬영) (2000조각 연습)개발 2023. 12. 25. 21:12
500조각 퍼즐로 테스트를 해본다. 500번까지 번호를 쓰고, 전부 사진 찍고, 데이터 처리를 한다. 사진을 하나하나 다 찍고 저장하기 위해서 사진 찍어주는 어플까지 만들었다. https://github.com/jkwchunjae/JigsawPuzzleSolver/tree/main/PuzzleCaptureMauiApp MAUI로 만들었는데, 운이 좋게도 간단히 만들 수 있었다. 기능은 없고, 사진을 찍으면 파일 번호가 1씩 자동 증가 하도록 만들어서 연속으로 사진 찍을 때 편했다. 이렇게 해서 번호를 인식해야 하는 작업을 피할 수 있었다. 이미지 처리해서 데이터 추출 후 퍼즐 표를 만들어서 잘 맞춰지는지 알아볼 계획.
-
[퍼즐:06] 1차 중간 점검개발 2023. 8. 13. 18:14
다른 퍼즐 100 조각을 가지고 테스트 해본다. 1. resize 2. outline 추출 3. corner 추출 4. edge 분리 뭐 하나 쉽게 되는게 없다. 1. 모서리 분리 과정에서 모서리의 경계 찾기 그림에서 보는 것과 같이 자주색 엣지가 노란색 쪽으로 약간 넘어갔다. 이 오차를 무시할 수 없는 이유는 끝 점을 기준으로 정규화를 할 텐데, 끝이 저렇게 붕 뜨게 되면 나중에 모서리 비교할 때 제 짝을 못 찾게 된다. 이렇게 되는 이유는 코너 검출에서 코너가 완벽히 구석이 아니라 약간 안쪽으로 설정되는데, 모서리 중 하나에 더 가까이 붙는 경우가 많았다. 몇 픽셀 차이 아니지만 확대해서 보면 차이가 보였다. 2. 코너 검출 하기 코너가 딱 4개가 안 찾아지는 것도 문제이지만, 이 경우는 이미 알고있..
-
[퍼즐:05] 모서리 테스트개발 2023. 8. 11. 21:55
쉽게 말해 각 퍼즐의 두 모서리가 이어지는지 검사하는 것. 모서리 정규화 과정에서 Line, Hole, Head로 구분했다. 한 퍼즐의 Hole을 잡고 나머지 퍼즐의 Head와 비교하며 가장 가까운 edge를 찾는 과정이다. 정규화 한 edge를 그냥 비교하면 안되고, 한 쪽을 뒤접어서 비교해야 한다. public Edge Reverse() { Point first = Points.OrderBy(p => p.X).First(); Point last = Points.OrderBy(p => p.X).Last(); // last -> first의 각을 계산한다. pi에 가까운 숫자가 나온다. var angle = CalculateAngleBetweenPoints(last, first); var reversed..
-
[퍼즐:04] 퍼즐 모서리 정규화개발 2023. 8. 8. 00:32
정규화 모든 모서리를 x축에 딱 붙이는 작업을 한다. 이렇게 해야 다른 모서리와 비교하기 쉽기 때문이다. 그런데, 뭔가 각도 계산이 잘 못 된 것 같다. 대충 chat gpt와 copilot이 하라는대로 했더니 이렇게 되었음. 숫자의 의미를 잘 이해하고, 이 화면은 좌표평면을 뒤집어 놓은 상태라는 것을 잘 생각하면 해결 할 수 있을 듯 그냥 각도 계산을 잘못 했었음. 모서리의 각도를 θ라고 했을 때 -θ 로 돌리면 정규화가 잘 됨. 위에 잘못된 정규화는 θ인 각을 θ 만큼 돌려서 문제였음. (단순한 문제였음) 단, 여기에서 중요한 점이 있는데 각을 잘 구해야 한다는 점. 그렇지 않으면 '홀'과 '헤드'가 바뀌어서 나온다는 점이다. 처음에 코너를 찾을 때 찾은 코너를 시계방향이던, 시계반대방향이던 통일시켜..
-
[퍼즐:03] 퍼즐 조각 외곽선을 각 모서리로 분할개발 2023. 8. 7. 00:26
외곽선과 코너를 찾은 후 할 일은 각 외곽선을 4개의 모서리(엣지)로 나누는 것이다. 이 작업은 생각보다 간단했다. 코너 4개의 번호를 0, 1, 2, 3 붙인다. (0번과 3번은 대각선 관계에 놓이도록 지정한다.) 그리고 4개의 점으로 만드는 직사각형을 설정한다. 모든 외곽선 점을 순회하면서 직사각형의 어느 선분에 가까운 점인지 판단한다. 만약 점과 선분과의 거리가 멀다면 이전 점의 정보를 가져와서 사용한다. 외곽선이 연속해서 나타난다는 점을 이용했다. 흰색 점이 선분에서 먼 점이다. copilot의 도움으로 어렵지 않게 구현할 수 있었다. https://github.com/jkwchunjae/JigsawPuzzleSolver/commit/590465af0fc7f16a16742c25803054fd79f..
-
[퍼즐:02] 퍼즐 조각 외곽선에서 코너 검출개발 2023. 8. 6. 22:37
chat gpt에 물어보니 두가지 알고리즘을 소개해줬다. OpenCV를 사용하여 이미지에서 코너를 찾는 방법은 주로 "코너 검출(Corner Detection)" 알고리즘을 활용합니다. 여러 알고리즘 중에서 가장 유명하고 효과적인 알고리즘은 "Harris 코너 검출"과 "Shi-Tomasi 코너 검출"입니다. 이들 알고리즘은 이미지의 코너 지점을 감지하는 데 사용됩니다. (chat gpt가 답변해줌) 이러저런 테스트 결과 "Shi-Tomasi" 알고리즘을 사용을 선택했다. 인자의 의미가 쉽게 느껴졌다. # outline = 검정 배경에 윤곽선만 표시한 이미지 corners = cv2.goodFeaturesToTrack(outline, maxCorners=4, qualityLevel=0.01, minDis..
-
[퍼즐:01] 퍼즐 조각 외곽선 추출개발 2023. 8. 6. 18:10
https://hellojkw.tistory.com/entry/직소-퍼즐-맞추는-프로그램-단계 직소 퍼즐 맞추는 프로그램 단계 퍼즐에 번호 쓰기 퍼즐 스캔 여러 퍼즐 이미지에서 각각의 이미지로 절단 퍼즐 조각에 써있는 번호 인식 퍼즐 조각에서 Outline 추출 Outline에서 Edge 추출 Edge Normalize Hole, Head 쌍 만들기 Piece에서 그 hellojkw.tistory.com 퍼즐을 맞추기 위한 단계 중 핵심은 사진을 디지털 퍼즐 객체로 바꾸는 것이다. 그 첫 번재가 외곽선을 추출하는 것. Canny 라는 알고리즘이 대표적인 윤곽선 알고리즘인데 잘 모르겠어서 접어뒀다. 배경과 전경(사물)을 분리하는 알고리즘으로 GrabCut을 알게 되었다. 속도가 너무 느리기도 하고 퍼즐에 ..