-
[퍼즐: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, minDistance=100)
방법1: 코너를 딱 4개 찾는다. 코너의 최소 거리는 100. 한 번에 잘 찾아지면 좋겠다.
조각 두 개에 검사했는데, 잘 동작했다.
방법2: 코너를 30개 쯤 찾는다. 코너의 최소 거리를 짧게 10 정도.
찾아진 점들사이에서 내가 찾고 싶었던 점 4개를 찾는다.
방법1에서 원하는 점을 못 찾았을 때 방법2로 전환해서 점 4개를 찾을 계획
찾은 30개 점 중 가장 직사각형에 가까운 점 4개 조합을 찾으면 될 듯!
https://github.com/jkwchunjae/JigsawPuzzleSolver/commit/52cd63d81bae1a01642a9a814c3af46d46f16bec
import cv2 import numpy as np # 이미지를 불러오고 그레이스케일로 변환 image = cv2.imread('20230804_225655_3.jpg') # image = cv2.imread('20230806_161402.jpg') # image = cv2.resize(image, dsize=(0, 0), fx=0.2, fy=0.2, interpolation=cv2.INTER_AREA) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gaussian = cv2.GaussianBlur(gray, (5, 5), 0) _, black_white = cv2.threshold(gaussian, 127, 255, cv2.THRESH_BINARY) # 경계선 검출 (Canny edge detection 예제) edges = cv2.Canny(black_white, 50, 255) # 경계선 검출 결과에서 퍼즐 조각의 외곽을 감싸는 경계 상자를 찾음 contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) puzzle_contour = max(contours, key=cv2.contourArea) outline = np.zeros(image.shape, np.uint8) output = np.zeros(image.shape, np.uint8) cv2.drawContours(outline, [puzzle_contour], -1, (0, 255, 0), 1); cv2.drawContours(output, [puzzle_contour], -1, (0, 255, 0), 1); # 퍼즐 조각의 외곽을 감싸는 경계 상자를 이용하여 코너 추출 outline = cv2.cvtColor(outline, cv2.COLOR_BGR2GRAY) corners1 = cv2.goodFeaturesToTrack(outline, maxCorners=4, qualityLevel=0.01, minDistance=100) if corners1 is not None: corners1 = np.int0(corners1) for corner in corners1: x, y = corner.ravel() cv2.circle(output, (x, y), 5, (255, 0, 255), -1) # 결과 이미지 출력 cv2.imshow('Puzzle Area', output) cv2.waitKey(0) cv2.destroyAllWindows()
코너 중 알맞은 귀퉁이 4개 점 찾는 방법
'개발' 카테고리의 다른 글
[퍼즐:05] 모서리 테스트 (0) 2023.08.11 [퍼즐:04] 퍼즐 모서리 정규화 (0) 2023.08.08 [퍼즐:03] 퍼즐 조각 외곽선을 각 모서리로 분할 (0) 2023.08.07 [퍼즐:01] 퍼즐 조각 외곽선 추출 (0) 2023.08.06 [퍼즐:00] 직소 퍼즐 맞추는 프로그램 단계 (0) 2023.03.02