Processor

【OpenCV】 ORB(Oriented FAST and Rotated BRIEF)

작성자 임베디드코리아 작성일26-04-16 22:45 조회117회 댓글0건
< *  ORB(Oriented FAST and Rotated BRIEF)  * >

◆ ORB(Oriented FAST and rotated BRIEF) 알고리즘은 FAST(Features from Accelerated Segment Test) 알고리즘, 
    BRIEF(Binary Robust Independent Elementary Features) 알고리즘, 해리스 코너 알고리즘을 결합한 알고리즘이다.
◆ ORB 알고리즘을 이해하기 위해서는 FAST 알고리즘과 BRIEF 알고리즘을 이해할 필요가 있다.


<< FAST(Features from Accelerated Segment Test) 알고리즘 >>
------------------------------------------------------------------------
◆ FAST 알고리즘은 로스텐(Rosten)과 드리먼드(Drummond)가 제안한 피처 검출기 알고리즘으로서
  픽셀 P와 픽셀 주변의 작은 원 위에 있는 픽셀의 집합을 비교하는 방식이다.
◆ 픽셀 P의 주변 픽셀에 임곗값을 적용해 어두운 픽셀, 밝은 픽셀, 유사한 픽셀로 분류해
    원 위의 픽셀이 연속적으로 어둡거나 밝아야 하며 이 연속성이 절반 이상이 돼야 한다.
◆ 이 조건을 만족하는 경우 해당 픽셀은 우수한 특징점으로 볼 수 있다는 개념이다.


<< BRIEF(Binary Robust Independent Elementary Features) 알고리즘 >>
---------------------------------------------------------------------------------
◆ BRIEF 알고리즘은 칼론더(Calonder) 연구진이 개발해 칼론더 피처라고도 부른다
◆ 이 알고리즘은 특징점(Key Point)을 검출하는 알고리즘이 아닌 검출된 특징점에 대한
    기술자(Descriptor)를 생성하는 데 사용한다.
◆ 특징점 주변 영역의 픽셀을 다른 픽셀과 비교해 어느 부분이 더 밝은지를 찾아 이진 형식으로 저장한다.
◆ 가우시안 커널을 사용해 이미지를 컨벌루션 처리하며, 피처 중심 주변의 가우스 분포를 통해
    첫 번째 지점과 두 번째 지점을 계산해 모든 픽셀을 한 쌍으로 생성한다.
    -- 두 개의 픽셀을 하나의 그룹으로 묶는 방식이다.


<< ORB(Oriented FAST and Rotated BRIEF) 알고리즘 >>
---------------------------------------------------------------
◆ ORB 알고리즘은 FAST 알고리즘을 사용해 특징점을 검출한다.
◆ FAST 알고리즘은 코너뿐만 아니라 가장자리에도 반응하는 문제점으로 인해
  해리스 코너 검출 알고리즘을 적용해 최상위 특징점만 추출한다.
◆ 이 과정에서 이미지 피라미드를 구성해 스케일 공간 검색을 수행한다.
◆ 이후 스케일 크기에 따라 피처 주변 박스 안의 강도 분포에 대해 X축과 Y축을 기준으로 1차 모멘트를 계산한다.
◆ 1차 모멘트는 그레이디언트의 방향을 제공하므로 피처의 방향을 지정할 수 있다.
◆ 방향이 지정되면 해당 방향에 대해 피처 벡터를 계산할 수 있으며,
  피처는 회전 불변성을 갖고 있으며 방향 정보를 포함하고 있다.
◆ 하나의 ORB 피처를 가져와 피처 주변의 박스에서 1차 모멘트와 방위 벡터를 계산한다.
◆ 피처의 중심에서 모멘트가 가리키는 위치까지 벡터를 피처 방향으로 부여하게 된다.
◆ ORB의 기술자는 BRIEF 기술자에 없는 방향 정보를 갖고 있다.
◆ ORB 알고리즘은 SIFT(Scale-Invariant Feature Trasnform) 알고리즘과
    SURF(Speeded-Up Robust Features) 알고리즘 을 대체하기 위해
    OpenCV Labs에서 개발됐으며 속도 또한 더 빨라졌다.


----< 예제 :  ORB.py  >-------------------------------------------------------------------
import cv2
import numpy as np

src = cv2.imread("apple_books.jpg")
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
target = cv2.imread("apple.jpg", cv2.IMREAD_GRAYSCALE)

orb = cv2.ORB_create(
    nfeatures=40000,
    scaleFactor=1.2,
    nlevels=8,
    edgeThreshold=31,
    firstLevel=0,
    WTA_K=2,
    scoreType=cv2.ORB_HARRIS_SCORE,
    patchSize=31,
    fastThreshold=20,
)

kp1, des1 = orb.detectAndCompute(gray, None)
kp2, des2 = orb.detectAndCompute(target, None)

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)

for i in matches[:100]:
    idx = i.queryIdx
    x1, y1 = kp1[idx].pt
    cv2.circle(src, (int(x1), int(y1)), 3, (255, 0, 0), 3)

cv2.imshow("src", src)
cv2.waitKey()
--------------------------------------------------------------------------------------------------------