Python과 OpenCV – 37 : ORB (Oriented FAST and Rotated BRIEF)을 이용한 이미지의 특징점 추출

이 글의 원문은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_orb/py_orb.html 입니다.

ORB는 다른 특징점 추출 알고리즘과는 다르게 OpenCV 연구소에서 개발되었습니다. 특허권이 걸린 SIFT와 SURF를 대신할 수 있는데, 계산비용과 매칭 속도가 더 좋다고 합니다. ORG는 기본적으로는 FAST의 키포인트 검출기와 BRIEF의 기술자의 혼합하면서 속도를 더 개선 시켰다고 합니다. 결과적으로 ORB는 SURF와 SIFT보다 더 빠르고 더 잘 작동합니다. ORB는 저전력의 단말기에서도 잘작동하며 파노라마 이미지 생성을 위한 이미지 붙이기 등의 기능에 적합하다고 합니다.

OpenCV에서 ORB에 대한 예제 코드는 아래와 같습니다.

import numpy as np
import cv2

filename = './data/butterfly.jpg'
img = cv2.imread(filename, cv2.COLOR_BGR2GRAY)
img2 = None

orb = cv2.ORB_create()
kp, des = orb.detectAndCompute(img, None)

img2 = cv2.drawKeypoints(img, kp, None, (255,0,0), flags=0)
cv2.imshow('img2', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

위 코드에 대한 실행 결과는 다음과 같습니다.

Python과 OpenCV – 36 : BRIEF (Binary Robust Independent Elementary Features)을 이용한 이미지의 특징점 추출

이 글의 원문은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_brief/py_brief.html 입니다.

지금까지 살펴본 SIFT나 SURF 등은 이미지의 특징점을 검출하기 위해 제법 많은 메모리를 사용하는데, 자원에 제약이 심한 임베디드 장비에서는 메모리를 적게 사용하는 특징점 검출 방법이 필요하며, 그 방법이 바로 BRIEF입니다.

BRIEF는 특징점에 대한 기술자(Descriptor)일 뿐, 특징점을 검출하는 방법은 제공하지 않는데.. 이를 위해 다른 특징점을 검출하는 SIFT나 SURF 등을 사용해야 합니다. BRIEF에 대해 설명하는 논문에서는 CenSurE를 추천하고 있습니다. OpenCV에서는 이를 STAR라고도 합니다. 여튼 CenSurE는 빠르며 다른 방법보다 BRIEF에 더 최적화되어 있다고 합니다.

OpenCV에서 제공하는 BRIEF의 예제를 살펴보면 다음과 같습니다.

import numpy as np
import cv2
from matplotlib import pyplot as plt

filename = './data/butterfly.jpg'
img = cv2.imread(filename, 0)

star = cv2.xfeatures2d.StarDetector_create()
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()

kp = star.detect(img,None)
kp, des = brief.compute(img, kp)

img2 = cv2.drawKeypoints(img, kp, None, (255,0,0))
cv2.imshow('img2', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

8번은 STAR 특징점 검출을 위한 객체를 생성합니다. 이렇게 생성된 STAR 검출기를 통해 특징점을 검출하고, 이 특징점을 이용해 9번 코드에서 생성한 BRIEF 객체를 통해 특징점의 기술자(Descriptor)를 계산하는 것입니다. 실행 결과는 다음과 같습니다.