기술자 - Descriptor, Feature vector
기술자는 특징벡터라고 불리며, 검출된 특징점 근방의 부분 영상을 표현하는 실수 또는 이진 벡터를 의미한다.
실수값으로 표현한 영상의 모양 혹은 색상 분포로 이해하면 되며, OpenCV에서는 2차원 행렬(numpy.ndarray)로 표현한다.
행 개수는 특징점 개수, 열 개수는 특징점 기술자 알고리즘에 의해 다르게 정의된다.
표현 방법
- 실수 기술자: numpy.float32
- 이진 기술자: numpy.uint8
실수 기술자
numpy.float32 자료형을 사용하여 실수 정보를 저장하는 방식으로, 사용하는 알고리즘은 SIFT, SURF, KAZE 등이 있다.
실수 기술자는 보통 L2 노름(L2 norm)을 사용하여 유사도를 판단한다.
- 특징점 부근에 특징점 키포인트 객체 반환값 사이즈에 있는 멤버 변수를 이용해서 적절한 크기의 부분영상을 추출
- 부분영상을 16X16로 분할하고 그레디언트 방향성분에 대한 히스토그램을 추출
- 부분 영상에 대해서 각각의 작은 사각형에서 방향 히스토그램을 계산
- 방향 히스토그램을 4X4 단위로 모아서 45도씩 8개의 방향으로 표현
- 방향 성분으로 부분 영상의 특징을 기술
이진 기술자 - Binary desciptor
보통 numpy.unit8 자료형을 사용하여 비트 단위로 영상 특징 정보를 저장하는 방식으로, 사용하는 알고리즘은 AKAZE, ORB, BRIEF 등이 있다.
이진 기술자는 해밍 거리(Hamming distance)를 사용하여 유사도를 판단한다.
- 특징점 주변 부분 영상을 잘라낸다.
- 부분 영상안에서 미리 정의해둔 점을 고정 시켜둔다.
- 1번, 2번, 3번점 각각의 밝기를 비교한다.
1번과 2번 중 1번이 더 밝으면 1로 기술
2번과 3번 중 2번이 더 어두우면 0으로 기술
1번과 3번 중 1번이 더 밝으므로 1으로 기술 - 정보를 취합하면 [1 0 1] 3비트 자료가 되는데 이 것으로 부분 영상의 특징을 기술
기본적으로 밝기 차이 값들을 이진수로 표현한 것이다.
특징점 기술자 계산 함수 - cv2.Feature2D.compute
Detect 함수로 구한 키포인트 객체를 입력 값으로 사용
keypoints, descriptors = cv2.Feature2D.compute(image, keypoints, descriptors=None)
- image: 입력 영상
- keypoints: 검출된 특징점 정보. cv2.KeyPoint 객체의 리스트.
- descriptors: 특징점 기술자 행렬
특징점 검출 및 기술자 계산 함수 - cv2.Feature2D.detectAndCompute
keypoints, descriptors = cv2.Feature2D.detectAndCompute(image,
mask=None,
descriptors=None)
- image: 입력 영상
- mask: 마스크 영상
- keypoints: 검출된 특징점 정보. cv2.KeyPoint 객체의 리스트.
- descriptors: 특징점 기술자 행렬
* 디텍션만 가능한 알고리즘에 detectAndCompute 함수를 적용하면 프로그램이 종료된다.
특징점 기술자 계산 예제
황선규 박사님 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)
_, desc1 = feature.compute(src1, kp1)
kp2, desc2 = feature.detectAndCompute(src2, None)
print('desc1.shape:', desc1.shape)
print('desc1.dtype:', desc1.dtype)
print('desc2.shape:', desc2.shape)
print('desc2.dtype:', desc2.dtype)
# 검출된 특징점 출력 영상 생성
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
ORB
OpenCV 주요 특징점 알고리즘과 기술자 특성
특징점 검출 알고리즘 성능 비교
연산 속도 비교
ORB는 내부적으로 FAST 알고리즘이 구현되어 있기 때문에 제일 빠름.
반복 검출율 비교
특징점 검출 알고리즘 성능 비교
ORB는 매칭 퀄리티, 검출 결과가 안좋지만 속도가 빨라 자주 이용되며, 매칭하는 성능에 있어서는 AKAZE가 더 좋다.
매칭 성능은 SHIFT가 가장 좋지만 연산 시간이 제일 느리다.
'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 |