OpenCV 특징점 검출과 기술

BERT·2023년 5월 1일
0

Computer Vision

목록 보기
46/56

OpenCV 특징점 클래스

Feature2D 클래스

cv::Feature2D
  detect()
  compute()
  detectAndCompute()

파생 클래스

cv::SIFT
cv::xfeatures2d::SURF
cv::KAZE
cv::AKAZE
cv::ORB
cv::FastFeatureDetector

특징점 표현을 위한 KeyPoint 클래스

cv::KeyPoint
  pt
  size
  angle

특징점 클래스 객체 생성 함수

static Ptr<SIFT> SIFT::create(...);
static Ptr<KAZE> KAZE::create(...);
static Ptr<AKAZE> AKAZE::create(...);
static Ptr<ORB> ORB::create(...);

Feature2D 상속 클래스들은 모두 create()라는 이름의 정적 멤버 함수를 제공
각각의 create() 함수는 다수의 인자를 가지지만 디폴트 인자가 정의되어 있음
Ptr()은 OpenCV에서 구현한 스마트 포인트 클래스

특징점 검출 방법

영상에서 특징점 검출 함수

image : 입력 영상
keypoints : 출력 검출된 특징점 정보
mask : 마스크 영상

virtual void Feature2D::detect(InputArray image, std::vector<KeyPoint>& keypoints,
							   InputArray mask = noArray());

검출된 특징점 그리기 함수

image : 입력 영상
keypoints : 입력 영상에서 검출된 특징점
outImage : 출력 영상
color : 특징점 색상
flags : 특징점 그리기 방법

DrawMatchesFlags::DEFAULT특징점 위치만을 표현하는 작은 크기의 원
DrawMatchesFlags::DRAW_RICH_KEYPOINTS특징점의 크기와 방향을 반영한 원
void drawKeypoints(InputArray image,
				   const std::vector<KeyPoint>& keypoints,
                   InputOutputArray outImage,
                   const Scalar& color = Scalar::all(-1),
                   int flags = DrawMatchesFlags::DEFAULT);

keypoint

SIFT

KAZE

방향 성분 X

ORB

하나의 코너에 중복된 것이 많음

AKAZE

특징점 기술자 구하기

기술자

각각의 특징점 근방의 부분 영상을 표현하는 실수 또는 이진 벡터
OpenCV에서는 Mat객체로 표현
행 개수 : 특징점 개수
열 개수 : 특징점 기술자 알고리즘에 의해 정의됨

실수 기술자

주로 특징점 부근 부분 영상의 방향 히스토그램을 사용
보통 float 자료형을 사용하여 실수 정보를 저장하는 방식
실수 기술자를 사용하는 알고리즘 : SIFT, SURF, KAZE 등
실수 기술자는 보통 L2 norm을 사용하여 유사도를 판단

이진 기술자

이진 테스트를 이용하여 부분 영상의 특징을 기술
보통 uchar 자료형을 사용하여 비트 단위로 영상 특징 정보를 저장
이진 기술자를 사용하는 알고리즘 : AKAZE, ORB, BRIEF 등
이진 기술자는 Hamming distance를 사용하여 유사도를 판단

특징점에서 기술자(특징 벡터) 계산

images : 입력 영상
keypoints : 입력 검출된 특징점 정보
descriptors : 출력 특징점 기술자 행렬

virtual void Feature2D::compute(InputArray images, std::vector<KeyPoint>& keypoints,
								OutputArrays descriptors);

특징점 검출 및 기술자(특징 벡터) 계산

image : 입력 영상
mask : 마스크 영상
keypoints : 특징점 정보
descriptors : 특징점 기술자 행렬
useProvidedKeypoints : 인자로 전달된 keypoints 정보 사용 여부

virtual void Feature2D::detectAndCompute(InputArray image, InputArray mask,
										 std::vector<KeyPoint>& keypoints,
                                         OutputArray descriptors,
                                         bool useProvidedKeypoints = false);

descriptors

SIFT

KAZE

ORB

AKAZE

OpenCV 주요 특징점 알고리즘과 기술자 특성

속도 ORB
속도 + 성능 AKAZE
성능 SIFT

특징점
알고리즘
기술자
지원
depth이진
기술자
Extra
Module
SIFT128CV_32FXX
SURF64CV_32FXO
KAZE64CV_32FXX
AKAZE61CV_8UOX
ORB32CV_8UOX
BRISK64CV_8UOX

0개의 댓글