ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 특징점 검출
    컴퓨터 비젼(Computer Vision)/특징점 검출과 매칭 2022. 2. 21. 18:09

    코너 검출 방법의 문제점

    • 이동, 회전 변환에 강인
    • 크기 변화에 취약

     

    용어

    특징점(feature point) = 키포인트(keypoint) =  관심점(interest point)

    기술자(descriptor) = 특징 벡터(feature vector)

     

     

    크기 불변 특징점 검출 방법

    SIFT, KAZE, AKAZE, ORB 등 다양한 특징점 검출 방법에서 스케일 스페이스 (scale-space), 이미지 피라미드 (image pyramid)를 구성하여 크기 불변 특징점을 검출

     

     

    OpenCV 특징점 검출 클래스

    https://docs.opencv.org/4.x/d0/d13/classcv_1_1Feature2D.html

     

    특징점 검출 알고리즘 객체 생성

    cv2.SIFT_create(, ...) -> retval
    cv2.KAZE_create(, ...) -> retval
    cv2.AKAZE_create(, ...) -> retval
    cv2.ORB_create(, ...) -> retval
    ...
    • retval: 각 특징점 검출 알고리즘 객체
    • 각각의 알고리즘은 고유한 파라미터를 인자로 받을 수 있음
    • 대부분 인자는 기본값을 가지고 있으므로 함수 인자 없이 호출 가능

    특징점 검출 알고리즘

    cv2.Feature2D.detect(image, mask=None) -> keypoints
    • image: 입력 영상
    • mask: 마스크 영상
    • keypoints: 검출된 특징점 정보. cv2.KeyPoint 객체 리스트

    검출된 특징점 그리기 함수

    cv2.drawKeypoints(image, keypoints, outImage, color=None, flags=None) -> outImage
    • image: 입력 영상
    • keypoints: 검출된 특징점 정보. cv2.KeyPoint 객체의 리스트
    • outImage: 출력 영상
    • color: 특징점 표현 색상. 기본값은 (-1, -1, -1, -1)이며, 랜덤 색상을 표현
    • flags: 특징점 표현 방법
      • cv2.DRAW_MATCHES_FLAGS_DEFAULT: 특징점 위치만을 표현하는 작은 크기의 원
      • cv2.DRAW_MATCHES_FLAGS_DRAW_RIGH_KEYPOINTS: 특징점의 크기와 방향을 반영한 원

     

    예시

    import sys
    import numpy as np
    import cv2
    
    
    # 영상 불러오기
    src1 = cv2.imread('graf1.png', cv2.IMREAD_GRAYSCALE)
    src2 = cv2.imread('graf3.png', cv2.IMREAD_GRAYSCALE)
    
    if src1 is None or src2 is None:
        print('Image load failed!')
        sys.exit()
    
    feature1 = cv2.KAZE_create()
    feature2 = cv2.AKAZE_create()
    feature3 = cv2.ORB_create()
    
    kp1_1 = feature1.detect(src1)
    kp1_2 = feature1.detect(src2)
    kp2_1 = feature2.detect(src1)
    kp2_2 = feature2.detect(src2)
    kp3_1 = feature3.detect(src1)
    kp3_2 = feature3.detect(src2)
    
    print('# of kp1_1:', len(kp1_1))
    print('# of kp1_2:', len(kp1_2))
    print('# of kp2_1:', len(kp2_1))
    print('# of kp2_2:', len(kp2_2))
    print('# of kp3_1:', len(kp3_1))
    print('# of kp3_2:', len(kp3_2))
    
    dst1_1 = cv2.drawKeypoints(src1, kp1_1, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    dst1_2 = cv2.drawKeypoints(src1, kp1_2, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    dst2_1 = cv2.drawKeypoints(src1, kp2_1, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    dst2_2 = cv2.drawKeypoints(src1, kp2_2, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    dst3_1 = cv2.drawKeypoints(src1, kp3_1, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    dst3_2 = cv2.drawKeypoints(src1, kp3_2, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    
    
    cv2.imshow('dst1_1', dst1_1)
    cv2.imshow('dst1_2', dst1_2)
    cv2.imshow('dst2_1', dst2_1)
    cv2.imshow('dst2_2', dst2_2)
    cv2.imshow('dst3_1', dst3_1)
    cv2.imshow('dst3_2', dst3_2)
    
    cv2.waitKey()
    cv2.destroyAllWindows()
    # of kp1_1: 3159
    # of kp1_2: 3625
    # of kp2_1: 2418
    # of kp2_2: 2884
    # of kp3_1: 500
    # of kp3_2: 500

     

    KAZE

    AKAZE

    ORB

     

    이미지 출처

    https://docs.opencv.org/4.x/db/d70/tutorial_akaze_matching.html

    '컴퓨터 비젼(Computer Vision) > 특징점 검출과 매칭' 카테고리의 다른 글

    좋은 매칭 선별  (0) 2022.02.22
    특징점 매칭  (0) 2022.02.22
    특징점 기술  (0) 2022.02.22
    코너 검출  (0) 2022.02.21

    댓글

Designed by Tistory.