Harris, GFTT, FAST 코너 검출 방법의 문제점
Harris, GFTT, FAST 코너 검출 방법은 이동, 회전 변화에 강인하지만 크기 변환에 취약하다는 단점이 있다.
확대된 영상에서 작은 사각형으로 코너를 찾으려하면 기존의 코너가 에지처럼 보이게 되며, 이 경우에 다양한 크기 관점에서 특징점을 검출하는 것이 필요하다.
고유한 특징을 나타내는 점들을 집합한 것을 특징점(feature point) or 키포인트(keypoint) or 관심점(interest point) 라고 한다.
특징점 주변의 부분 영상을 잘라서 특징점에 대한 특징을 기술하는 방법을 기술자(descriptor) or 특징 벡터(feature vector)이라고 한다.
두 개의 영상이 같은지 다른지 판별하기 위해 매칭을 할 때 특징점을 활용한다.
크기 불변 특징점 검출 방법
SIFT, KAZE, AKAZE, ORB 등 다양한 특징점 검출 방법에서 스케일 스페이스(scale-space), 이미지 피라미드(image pyramid)를 구성하여 크기 불변 특징점을 검출한다.
스케일 스페이스(Scale Space)는 리사이즈와 가우시안 블러링을 여러번 하는 방법이다.
가우시안 블러링을 통해 초점이 안맞는 가상의 영상을 만들어 완전한 코너는 아니지만 반복적으로 검출될 수 있는 점들을 검출하는 형태로 구현하며, 대표적인 방법이 SIFT 이다.
Feature2D 클래스와 파생 클래스
Feature2D 클래스에 자식 클래스 형태로 구현되어 있다.
Feature2D 클래스에 선언된 detect(), compute(), detectAndCompute() 함수는 자식 클래스에서도 이용할 수 있다.
특징점 검출 알고리즘 객체 생성 - cv2.[방법]_create
cv2.KAZE_create(, ...) -> retval
cv2.AKAZE_create(, ...) -> retval
cv2.ORB_create(, ...) -> retval
cv2.xfeatures2d.SIFT_create(, ...) -> retval
- retval : 각 특징점 검출 알고리즘 객체
- 참고사항
- 각각의 알고리즘은 고유한 파라미터를 인자로 받을 수 있음
- 대부분의 인자는 기본값을 가지고 있으므로 함수 인자 없이 호출 가능
특징점 검출 함수 - cv2.Feature2D.detect
keypoints = cv2.Feature2D.detect(image, mask=None)
- image: 입력 영상
- mask: 마스크 영상
- keypoints: 검출된 특징점 정보. cv2.KeyPoint 객체의 리스트
키포인트 클래스는 pt, size, angle 3가지 변수를 갖고 있다.
- pt는 float 형태로 x,y 좌표를 저장
- size는 특징점을 검출할 때 어느정도 주변 크기를 가지고 특징점을 검출했는지에 대한 정보
- angle은 부분 영상의 주된 방향 변수
검출된 특징점 그리기 함수 - cv2.drawKeypoints
outImage = cv2.drawKeypoints(image, keypoints, outImage, color=None, flags=None)
- image: 입력 영상
- keypoints: 검출된 특징점 정보. cv2.KeyPoint 객체의 리스트.
- outImage: 출력 영상
- color: 특징점 표현 색상. 기본값은 (-1, -1, -1, -1)이며, 이 경우 임의의 색상으로 표현.
- flags: 특징점 표현 방법
- cv2.DRAW_MATCHES_FLAGS_DEFAULT : 특정한 위치만을 표현하는 작은 크기의 원
- cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS : 특징점의 크기와 방향을 반영한 원
특징점 검출 예제
황선규 박사님 github홈페이지 sunkyoo.github.io/opencv4cvml/
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()
# 특징점 알고리즘 객체 생성 (KAZE, AKAZE, ORB 등)
feature = cv2.KAZE_create()
#feature = cv2.AKAZE_create()
#feature = cv2.ORB_create()
# 특징점 검출
kp1 = feature.detect(src1)
kp2 = feature.detect(src2)
print('# of kp1:', len(kp1))
print('# of kp2:', len(kp2))
# 검출된 특징점 출력 영상 생성
dst1 = cv2.drawKeypoints(src1,
kp1,
None,
flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
dst2 = cv2.drawKeypoints(src2,
kp2,
None,
flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.waitKey()
cv2.destroyAllWindows()
KAZE
AKAZE
'OpenCV' 카테고리의 다른 글
[OpenCV with Python] 특징점 검출과 매칭 : 특징점 매칭 (0) | 2022.02.05 |
---|---|
[OpenCV with Python] 특징점 검출과 매칭 : 특징점 기술 (0) | 2022.02.05 |
[OpenCV with Python] 특징점 검출과 매칭 : 코너 검출 (0) | 2022.02.05 |
[OpenCV with Python] 영상 분할과 객체 검출 : HOG 알고리즘 - 보행자 검출 (0) | 2022.02.05 |
[OpenCV with Python] 영상 분할과 객체 검출 : 캐스케이드 분류기 - 얼굴 검출 (0) | 2022.02.05 |