[OpenCV] 05-8. ORB (Oriented FAST and Rotated BRIEF)
🐍Python/OpenCV

[OpenCV] 05-8. ORB (Oriented FAST and Rotated BRIEF)

728x90
반응형

< ORB (Oriented FAST and Rotated BRIEF) >

이번 장에서는

  • ORB의 기초

에 대해서 알아볼 것이다.

Theory

ORB는 SIFT 또는 SURF의 효율적인 대안이다. 제목처럼, SIFT와 SURF의 연산 비용, 성능, 특허에 필적하는 좋은 대안이다. ORB는 그냥 사용가능하다! (SIFT,SURF와 달리!)

ORB는 기본적으로 성능을 높이기 위해 많은 수정을 거친 FAST 키포인트 탐지기와 BRIEF 디스크립터의 통합본이다. 먼저 키포인트를 찾기 위해 FAST를 사용하고, 그 다음 Harris 코너 측정을 해서 상위 N개의 점들을 찾는다. 다중크기의 특성을 생성하기 위해 피라미드를 사용한다. 하지만 문제가 하나 있다! FAST는 방향을 계산하지 않는다는 것이다. 그러면 회전 불변성(회전해도 알아보는 능력)에 대해서는 어떻게 할까? 저자들은 이러한 부분에 대해서 수정을 거쳤다.

이는 코너가 중앙에 위치한 가중치가 적용된 중심의 강도(intensity of weighted centroid)를 계산한다. 이 코너점에서 중심점까지의 벡터의 방향은 방향성을 제시한다. 회전 불변성을 개선하기 위해, 모멘트는 반지름 r의 원 영역에 있어야 하는 x y로 계산된다. (r은 조각(patch)의 크기이다.)

이제 디스크립터에 대해, ORB는 BRIEF 디스크립터를 사용한다. 하지만 BRIEF가 이전에 회전에 대해서 성능이 낮은 것을 볼 수 있었다. 그래서 ORB는 키포인트 방향에 따라 BRIEF를 “조종한다”.위치 (xi,yi)에서 n개의 이진 테스트 특성 집합에 대해 이 픽셀들의 좌표를 포함하고 있다. 2×n 매트릭스, S를 정의한다. 그런 다음 패치의 방향인 θ를 사용하여, 회전 매트릭스를 찾아 S를 회전시켜 회전된 버전인 Sθ를 얻는다.

ORB는 2π/30(12도)의 증분으로 각도를 나누고, 미리 계산된 BRIEF 패턴들로 룩업 테이블(주어진 연산에 대해 미리 계산된 결과들의 배열(집합)을 말한다. 이 배열은 주어진 연산에 대한 결과를 계산하는 시간보다 더 빠르게 값을 취득해 갈 수 있도록 사용되는 레퍼런스로 사용된다. 실시간에서 주로 사용)을 만든다. 키포인트 방향 θ가 여러 관점에서 일관성이 있다면, 정확한 Sθ 포인트 집합이 해당 디스크립터를 계산하는데 사용될 것이다.

BRIEF는 각 비트 특성의 분산이 크고 평균이 0.5에 가깝다는 중요한 속성을 가지고 있다. 하지만 키포인트 방향에 따라 방향을 잡게 되면, 이 속성을 잃고 더 분산되게 된다. 입력에 따라 다르게 반응하기 때문에 높은 분산을 가질 때, 특성을 더더욱 구별되게 한다. 다른 바람직한 특성으로는 각 시험이 결과에 기여하기 때문에 테스트와 무관하게 한다는 것이다. 이러한 모든 것들을 해결하기 위해, ORB는 분산이 높고, 평균이 0.5에 가까울 뿐 아니라 상관 관계가 없는 이진 테스트들에 대해 greedy search를 실행한다. 이 결과는 rBRIEF라고 불린다.

디스크립터 매칭에는, 기존 LSH에서 개선된 다중 프로브 LSH가 사용된다. 이 논문은 ORB가 SURF나 SIFT보다 훨씬 빠르고, ORB 디스크립터가 SURF보다 더 잘 작동한다고 말한다. ORB는 파노라마 스티칭 등을 위한 저전력 장치에서 좋은 선택이다!

ORB in OpenCV

보통, cv2.ORB() 또는 feature2d를 이용해서 ORB 객체를 생성한다. 다양한 파라미터가 존재한다. 가장 유용한 것은nFeatures로 보유될 특성의 최댓값을 정해준다.(기본값은 500). scoreType은 특성의 순위를 매기기 위해 Harris score, FAST score를 사용할지 정한다.(기본값 Harris score) 다른 파라미터로 WTA_K는 oriented BRIEF 디스크립터의 각 요소를 생성하는 포인트의 수를 결정한다. 기본값은 2개, 즉 한 번에 2개의 점을 고른다는 것이다. 이 경우 매칭할 때,NORM_HAMMING distance가 사용된다. 만약에 WTA_K 값이 3이나 4라면, BRIEF 디스크립터를 생성하는데 3,4개의 점이 소요되는 경우, 매칭 distance는 NORM_HAMMING2로 정의된다.

아래 간단한 코드는 ORB를 보여준다.

import numpy as np
import cv2

img = cv2.imread('./images/irene.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img2 = None

orb = cv2.ORB_create()

# ORB로 키포인트 / 디스크립터 찾기
kp,des = orb.detectAndCompute(img,None)

# 키포인트들의 위치만 나타낸다. 크기 /방향 x
img2 = cv2.drawKeypoints(img,kp,img2,(0,255,0),flags=0)

cv2.imshow('Res',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

아래의 결과를 보자


ORB 특성 매칭은 다른 장에서 진행할 것이다!

728x90
반응형