ORB_feature_matching
2025. 3. 4. 22:53ㆍSLAM/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의 동작 과정
- FAST 알고리즘으로 특징점(코너) 검출
- Harris 코너 응답 값을 사용해 특징점 정제
- 강한 특징점 순서대로 N개 선택 (기본 500~1000개)
- 특징점 주변 패치(이미지 영역)에서 방향(orientation) 계산
- 회전에 강한 BRIEF 설명자 생성
- 매칭을 위해 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 |