ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [퍼즐: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개 점 찾는 방법

     

     

Designed by Tistory.