관리 메뉴

ComputerVision Jack

[컴퓨터 비전 - 지역 특징점 검출과 매칭2] 본문

Image Processing/Computer Vision

[컴퓨터 비전 - 지역 특징점 검출과 매칭2]

JackYoon 2020. 2. 7. 16:24
반응형

크기 불변 특징점 검출과 기술

코너는 회전 불변 특징점이다.

하지만 영상의 크기가 변경되는 과정에 있어서 코너가 아닐 수 도 있다.

영상의 크기 변환과 코너

위 그림을 통하여 크기가 다른 두 객체 영상을 코너 점을 이용하여 같은 위치를 판별하는 것에는 한계가 있다.

 

SFIT(Scale Invariant Feature Transform) 알고리즘

영상의 크기 변화에 무관하게 특징점을 추출하기 위해 입력 영상으로부터

스케일 스페이스(Scale space)를 구성한다.

스케일 스페이스는 다양한 표준편차를 이용한 가우시안 블러링을 적용하여 구성한 영상 집합이다.

가우시안 피라미드와 DoG 구성

한줄의 영상을 옥타브(octave)라고 부른다. 입력 영상의 크기를 가로, 세로 반으로 줄여가며 여러 옥타브를 구성한다.

 

SIFT알고리즘에서 크기에 불변한 특징점을 검출할 때, 인접한 가우시안 블러링 영상끼리 차영상을 사용한다.

이러한 차영상을 DoG(Difference of Gaussian)영상이라고 한다.

SIFT알로리즘은 특징점 검출하는 기능뿐만 아니라 특징점 주변의 픽셀 값을 이용한 기술자(descriptor)계산 방법도 포함

특징점 부근의 부분 영상으로부터 그래디언트 방향 히스토그램을 추출하여 기술자로 사용한다.

 

static Ptr<ORB> ORB::create(int n feature = 500, float scaleFactor = 1.2f, int nlevels = 8,

int edgeThreshold = 32, int firstLevel = 0, int WTA_K = 2, ORB::ScoreType scoreType = ORB::HARRIS_SCORE,                                                                                              int patchSize = 31, int fastThreshold = 20);

#ORB 클래스 객체를 생성하는 함수

ORB는 SIFT와 마찬가지로 특징점 검출과 기술을 함께 지원하는 알고리즘.

KAZE 특징점 검출 알고리즘을 사용하고 싶다면, KAZE::create()로 변경하면 된다.

 

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

#특징점 검출할 때, Feature2D::detect() 가상 멤버 함수를 사용한다.

 

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

#검출된 특징점에서 특징점 주변의 부분 영상을 표현하는 기술자 추출하는 가상 멤버 함수

 

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

#특징점 검출과 기술자를 한번에 수행하는 멤버 함수

 

void drawKeyPoints(InputArray image, const std::vector<KeyPoint>& keypoints, InputOutputArray outImage, const Scalar& color = Scalar::all(-1), DrawMatchesFlags  flags = DrawMatchesFalgs::DEFAULT);

#검출된 특징점을 직접 영상 위에 그린다.

 

영상에서 특징점 추출하기

특징점 매칭

두 영상에서 추출한 특징점 기술자를 비교하여 서로 비슷한 특징점을 찾는 작업

크기 불변 특징점으로부터 구한 기술자를 매칭하면 크기와 회전에 강인한 영상 매칭을 수행할 수 있다.

DMatch 클래스 사용

 

static Ptr<BFMatcher> BFMatcher::create(int normType = NORM_L2, bool, crossCheck = false);

#실제 매칭을 수행하는 BFMatcher 객체 생성

 

static Ptr<FlannBasedMatcher> FlannBasedMatcher::create();

#실제 매칭을 수행하는 FlannBasedMatcher 객체 생성. 조금더 단순하다.

 

void DescriptorMatcher::match(InputArray queryDescriptors, InputArray trainDescriptors, std::vector<DMatch>& matches, InputArray mask = noArray()) const;

#첫번째 입력 영상에서 포함된 기술자와 가장 유사한 기술자를 두번째 입력 영상에서 찾아낸다.

결과를 vector<DMatch>타입 변수 matches에 저장한다.

 

void drawMatches() 함수를 이용하여 매칭 결과를 가시적으로 표기한다.

 

영상 특징점 매칭
ex_detect_keypoint.cpp
0.00MB
ex_keypoints_matching.cpp
0.00MB

반응형
Comments