ORB(Oriented FAST and Rotated BRIEF)

Jomii·2023년 8월 14일
0

Computer Vision

목록 보기
6/15
post-thumbnail

OpenCV의 ORB (Oriented FAST and Rotated BRIEF)

특징점 검출 및 기술자(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)을 계산하지 못하므로 이부분을 개선하였다.

    • 패치 중앙에 모서리가 있을 경우, 강도를 가중치로 하는 패치의 중앙점을 계산한다.
    • 코너 중심점(O)으로 부터 패치 중앙점(C)으로 방향이 Orientation(θ)을 나타낸다.
  • Rotation Invariance(회전 불변성; 회전이 있어도 특징점 추출이 영향을 받지 않는 점)을 개선하기 위해 반경 r의 원형 영역에 있어야 하는 x, y로 모멘트가 계산된다

2) Descriptor 계산
BRIEF 알고리즘을 사용하여 FAST 알고리즘으로 추출한 키 포인트를 이진 특징 벡터로 변환한다.

  • 변환과정
    • BRIEF는 키 포인트 주변의 랜덤 픽셀 쌍을 선택한다.
    • 첫번째 픽셀은 키 포인트를 중심으로 하는 가우시한 분포에서 선택한다.
    • 두번째 픽셀은 첫번째 픽셀을 중심으로하는 2배 큰 분산을 가지는 분포(혹은 시그마)에서 선택한다.
    • 첫번째 픽셀이, 두번째 픽셀보다 밝다면 '1'을 부여한다. 반대라면 '0'.
    • BRIEF는 128번 반복하여 키 포인트 마다 128bit 벡터를 생성한다.


ORB의 주요 특징

  • 빠른 속도: 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()
profile
✉️ qtly_u@naver.com

0개의 댓글