rongxian
2022. 2. 21. 18:09
코너 검출 방법의 문제점
- 이동, 회전 변환에 강인
- 크기 변화에 취약
용어
특징점(feature point) = 키포인트(keypoint) = 관심점(interest point)
기술자(descriptor) = 특징 벡터(feature vector)
크기 불변 특징점 검출 방법
SIFT, KAZE, AKAZE, ORB 등 다양한 특징점 검출 방법에서 스케일 스페이스 (scale-space), 이미지 피라미드 (image pyramid)를 구성하여 크기 불변 특징점을 검출
OpenCV 특징점 검출 클래스
특징점 검출 알고리즘 객체 생성
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