특징점 검출 및 기술자(descriptor) 생성을 위한 알고리즘으로, 이미지에서 고유한 특징점을 찾고 이러한 특징점들을 설명하는 특징 기술자를 생성하는데 활용
ORB는 FAST (Features from Accelerated Segment Test)와 BRIEF (Binary Robust Independent Elementary Features) 알고리즘을 기반으로 개발되었으며, 이 두 알고리즘의 장점을 조합하여 빠르고 강건한 특징점 검출 및 기술자 생성을 수행
BRIEF는 특징점 검출을 지원하지 않는 디스크립터 추출기인데, BRIEF에 방향과 회전을 고려하도록 개선하고, 특징점 검출 알고리즘으로 FAST를 사용해 회전과 방향을 고려하도록 개선
1) Keypoint 추출
FAST로 Keypoint 추출한다.
Harris Corner 측정을 적용하여 Top N개 점을 찾는다.
피라미드를 사용하여 Multi-Scale 특징점을 계산한다.
(FAST 알고리즘 개선) FAST 알고리즘은 방향(Orientation)을 계산하지 못하므로 이부분을 개선하였다.
Rotation Invariance(회전 불변성; 회전이 있어도 특징점 추출이 영향을 받지 않는 점)을 개선하기 위해 반경 r의 원형 영역에 있어야 하는 x, y로 모멘트가 계산된다
2) Descriptor 계산
BRIEF 알고리즘을 사용하여 FAST 알고리즘으로 추출한 키 포인트를 이진 특징 벡터로 변환한다.
- BRIEF는 키 포인트 주변의 랜덤 픽셀 쌍을 선택한다.
- 첫번째 픽셀은 키 포인트를 중심으로 하는 가우시한 분포에서 선택한다.
- 두번째 픽셀은 첫번째 픽셀을 중심으로하는 2배 큰 분산을 가지는 분포(혹은 시그마)에서 선택한다.
- 첫번째 픽셀이, 두번째 픽셀보다 밝다면 '1'을 부여한다. 반대라면 '0'.
- BRIEF는 128번 반복하여 키 포인트 마다 128bit 벡터를 생성한다.
빠른 속도: ORB는 FAST 특징점 검출 알고리즘의 아이디어를 기반으로 하여 매우 빠른 속도를 가짐 -> 실시간 응용프로그램에서도 효과적으로 사용
회전 불변성: ORB는 특징점의 방향성을 고려하여 특징점을 검출하고, 이로 인해 회전에 강한 특징을 생성 가능 -> 많은 다른 특징점 검출 알고리즘들이 회전에 민감한 반면에 ORB는 회전 변화에 robust
binary descriptor: ORB는 BRIEF 알고리즘의 개념을 기반으로 binary descriptor를 생성하여 매우 작고 빠르게 연산이 가능
크기 불변성: ORB는 이미지 스케일의 변화에 상대적으로 강건
feature 매칭: 생성된 ORB descriptor는 다른 이미지에서 유사한 특징점을 찾는데 사용 -> 이를 통해 이미지 간의 대응점을 찾거나, 객체 검출 등의 작업을 수행
import cv2
# 이미지 로드
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# ORB 객체 생성
orb = cv2.ORB_create()
# 특징점 검출 및 기술자 생성
keypoints, descriptors = orb.detectAndCompute(image, None)
# 결과 특징점 그리기
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# 결과 출력
cv2.imshow('ORB Keypoints', image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()