CV 6주차 10월 23일

Cho's log·2023년 11월 23일

Computer Vision

목록 보기
6/7
post-thumbnail

1. 크기 불변 특징

영상의 특징 중에서 코너의 특징

  • 평탄한 영역 , 에지 영역에 비해 변별력이 높음
  • 이동 , 회전 변환에 강인
  • 크기 변환에 취약

크기 불변 특징점

  • 스케일 스페이스 또는 이미지 피라미드를 구성하여 영상의 크기가 바뀌더라도 반복적으로 검출될 수 있는 특징점을 찾으면 매칭 등의 응용에서 사용할 수 있음
  • 주요 크기 불변 특징점 알고리즘 : SIFT , SURF , KAZE , AKAZE , ORB 등

2. SIFT 알고리즘

1. Scale-space extrema detection

(1) 먼저 Scale-space (= 크기 공간)를 생성을 위해 원본 이미지를 다양한 크기로 resize해서 image pyramid를 만든다.

(2) 다음으로 image pyramid의 각 층 이미지(octave image)를 점점 더 커지는 σ(= gaussian blur scale factor)로 gaussian blurring를 적용한 이미지들을 얻는다.

(3) Difference of Gaussian(DoG) 이미지를 구한다. DoG 이미지는 아래 그림처럼 같은 octave 내 서로 다른 두 개 gaussian blurred image로 빼기 연산을 수행하여 생성한다.

(4) 마지막으로, 만들어진 DoG를 이용해 extrema detection을 수행한다. 해당 좌표가 극소점이거나 극대점이라 판단되면 이를 keypoint 후보군으로 분류

2. 키포인트 찾기 (keypoint localization)

(1) LOG 대신 DOG 영상의 모든점에서 local maxima 또는 local minima를 선택
(DOG는 LOG의 근사화 함수 -> σ = 1.6)

(2) 동일 스케일 DOG영상에서 주변 8개 점과 상/하 스케일 DOG 영상에서 18개 점 , 총 26개 점을 비교하여 지역 최솟값 또는 지역 최댓값을 선택


3. 방향 불변 특성을 위한 주 방향 성분 추출

(1) 키포인트 근방의 부분 영상을 추출
(2) 부분 영상의 모든 픽셀에서 그래디언트 성분(크기 & 방향)을 계산 -> 방향 성분에 대한 히스토그램 생성
(3) 히스토그램 최댓값 방향과 최댓값의 80% 이상 크기를 갖는 빈 방향을 키포인트 방향으로 설정 -> 하나의 좌표에서 여러 개의 키포인트 표현 가능

4. 키포인트 기술자(descriptor , feature vector)

(1) 각 키포인트 위치에서 스케일과 기준 방향을 고려하여 사각형 영역을 선택
(2) 사각형 영역을 4x4 구역으로 분할하고 각 구역에서 8방향의 방향 성분 히스토그램을 구함 -> 4x4x8 = 128 차원의 벡터

레나 영상에서 구한 SIFT 기술자의 예

3. OpenCV 특징점 검출과 기술

영상에서 특징점 검출 함수

검출된 특징점 그리기 함수

#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/core/ocl.hpp"

using namespace std;
using namespace cv;

int main()
{
	ocl::setUseOpenCL(false); // for ORB time check

	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return -1;
	}

	TickMeter tm;
	tm.start();

	Ptr<Feature2D> detector = SIFT::create(); // SIFT, KAZE, AKAZE, ORB

	vector<KeyPoint> keypoints;
	detector->detect(src, keypoints);

	tm.stop();
	cout << "Elapsed time: " << tm.getTimeMilli() << "ms." << endl;
	cout << "keypoints.size(): " << keypoints.size() << endl;

	Mat dst;
	drawKeypoints(src, keypoints, dst, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

	imshow("dst", dst);
	waitKey();
}
  • 실행 결과

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

0개의 댓글