ORB_feature_matching

2025. 3. 4. 22:53SLAM/image processing

📌 ORB (Oriented FAST and Rotated BRIEF)란?

ORB는 특징점 검출(Feature Detection)과 설명자 생성(Descriptor Computation)을 위한 알고리즘으로, OpenCV에서 널리 사용됩니다. SIFT(Scale-Invariant Feature Transform)와 SURF(Speeded-Up Robust Features)보다 빠르고, 특허 문제 없이 사용할 수 있는 장점이 있습니다.


1️⃣ ORB의 주요 특징

빠르고 효율적
SIFT/SURF보다 연산량이 적음
특허 문제 없음 (오픈소스)
크기(scale)와 회전(rotation)에 강함
SLAM, Visual Odometry, 스테레오 비전 등에 활용


2️⃣ ORB의 핵심 개념

ORB는 두 가지 주요 기술을 조합한 알고리즘입니다.

(1) FAST (Features from Accelerated Segment Test)

  • 이미지에서 코너(corner) 를 빠르게 검출하는 알고리즘
  • 하지만 방향 정보를 제공하지 않음 ❌

(2) BRIEF (Binary Robust Independent Elementary Features)

  • 특징점 주변의 픽셀 패턴을 이진(Binary) 방식으로 설명
  • 하지만 회전에 취약

ORB는 FAST + BRIEF를 개선하여 방향 정보를 추가하고, 회전 불변성을 강화한 알고리즘입니다.


3️⃣ ORB의 동작 과정

  1. FAST 알고리즘으로 특징점(코너) 검출
  2. Harris 코너 응답 값을 사용해 특징점 정제
  3. 강한 특징점 순서대로 N개 선택 (기본 500~1000개)
  4. 특징점 주변 패치(이미지 영역)에서 방향(orientation) 계산
  5. 회전에 강한 BRIEF 설명자 생성
  6. 매칭을 위해 Hamming 거리 기반 비교

4️⃣ ORB의 특징점 매칭

ORB 특징점을 비교할 때는 Brute-force 매칭 또는 FLANN(KNN 기반 매칭) 을 주로 사용합니다.

  • Brute-force Matcher (BFMatcher): Hamming 거리 기반
  • FLANN (Fast Library for Approximate Nearest Neighbors): 빠른 근사 최근접 이웃 탐색

📌 ORB의 장점 & 단점

ORB 특징설명

빠름 SIFT/SURF보다 빠르게 동작
특허 없음 누구나 자유롭게 사용 가능
회전 불변성 이미지 회전에 강함
규모(scale) 불변성 다양한 크기에서도 동작 가능
조명 변화에 취약 명암(밝기) 변화에 약함
SIFT보다 정밀도가 낮음 고정밀 매칭에는 부족할 수 있음

 

📌 ORB 프로그래밍 실행 과정

 

1️⃣ 입력 인자 처리

  • 실행 시 왼쪽 이미지 폴더 경로, 오른쪽 이미지 폴더 경로, 프레임 개수를 입력받음.
  • std::filesystem::path를 사용하여 폴더 내 이미지 파일들의 리스트를 가져옴.
  • 파일들을 정렬한 후, 입력받은 num_frames 만큼 크기 조정.

2️⃣ ORB 특징점 디텍터 및 매칭 알고리즘 생성

  • ORB(Oriented FAST and Rotated BRIEF) 특징점 디텍터를 생성하고 최대 1000개 특징점을 찾도록 설정.
  • BFMatcher(Brute-force Matcher, Hamming 거리 기반) 생성.
  • KNN(FLANN 기반 최근접 이웃 매칭) 생성.

3️⃣ 이미지 불러오기 및 특징점 추출

  • cv::imread()를 사용해 왼쪽(img_left), 오른쪽(img_right) 이미지를 불러옴.
  • ORB를 사용하여 각 이미지에서 특징점과 설명자(Descriptor) 추출.
  • 만약 설명자가 비어 있으면 해당 프레임을 건너뜀.

4️⃣ Brute-force (BF) 매칭 수행

  • bf_matcher->match()를 사용해 Hamming 거리 기반으로 특징점을 매칭.
  • 거리 값이 50 이하인 좋은 매칭(Good Matches) 만 필터링.

5️⃣ KNN 매칭 수행

  • knn_matcher.knnMatch()를 사용해 각 특징점에 대해 두 개의 최근접 이웃을 찾음.
  • Lowe’s Ratio Test (0.8) 를 적용하여 좋은 매칭만 필터링.

6️⃣ 매칭된 특징점을 이미지에 표시

  • cv::drawMatches()를 사용해 Brute-force 매칭 결과 시각화.
  • cv::drawMatches()를 사용해 KNN 매칭 결과 시각화.
  • cv::imshow()를 사용해 매칭된 이미지를 화면에 출력.
  • cv::waitKey(0)을 통해 사용자가 키를 누를 때까지 대기.

📌 정리

  • 왼쪽/오른쪽 이미지 파일 목록을 가져와 정렬 후 처리할 프레임 개수만큼 사용.
  • ORB를 사용해 각 이미지에서 특징점과 설명자 추출.
  • Brute-force (Hamming 거리)와 KNN (FLANN 기반)으로 특징점 매칭 수행.
  • 특징점 매칭 결과를 이미지에 그려서 시각적으로 확인.

Brute-force match가 KNN match보다 결과가 잘 나온 것을 확인할 수 있었다.

 

'SLAM > image processing' 카테고리의 다른 글

Optical Flow  (0) 2025.03.04
bow_matching  (0) 2025.03.04