[알고리즘]

FAST Corner Detection이란 무엇인가 및 예제 코드

Neo Park 2012. 10. 19. 11:03

코너를 검출하기 위해 가장 많이 사용하는 것이 Harris corner detector인데..
여기서 설명하고자 하는 것은 2006년 European Conference on Computer Vision (ECCV)에 나온 논문인
Machine learning for high-speed corner detection 이다.

그 원리를 간단히 설명하면
코너를 검출하기 위해 주변 모든 픽셀을 고려하지 않고..
machine learning 방법을 통해 알게된 주변 픽셀 고려 순서를 이용하여
코너가 아닌 것들은 미리 제거하는 방법을 통해 빠르게 코너를 추출한다. 
자세한 내용은 논문 참조.


코드와 바이너리 실행 파일이 다양한 버전으로 작성되어 있다. 
여기서 Standalone C 버전OpenCV 연동 버전(추후 설명)을 설명하고자 한다. 

1. Standalone C 버전
소스 코드(2.1 버전) :   fast-C-src-2.1.zip


압축을 풀명 다음과 같은 파일들이 나온다. 

fast.c, fast.h, fast_9.c, fast_10.c, fast_11.c, fast_12.c, LICENSE, nonmax.c, README

fast.h 파일을 보면 다양한 함수들이 선언되어 있는데,
여기서 우리가 사용하게 되는 함수들은 "xy* fastn_detect_nonmax"이다. (여기서 n는 9, 10, 11, 12)

함수가 입력으로 받는 파라미터는

1   
2
3
4
5
6
const byte* im        \\ 영상 데이터
int xsize             \\ 영상 너비
int ysize             \\ 영상 높이
int stride            \\ 영상 데이터의 실제 너비
int b                 \\ threshold, default 20.
int* ret_num_corners  \\ 결과로 나온 코너의 개수

출력은 결과로 나온 코너들의 좌표들이다. (xy 구조체)

640x480 크기의 8비트 흑백 영상 image.raw라는 것이 있다고 가정하고
예제 프로그램을 작성하면 다음과 같다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void main()
{
    FILE *fp = fopen("image.raw", "rb");
    int width, height, threshold = 20, nCorners, widthStep;
    unsigned char *imgData = NULL;
    xy* corners = NULL;
  
    width = 640, height = 480;
    imgData = (unsigned char*)calloc(width*height, sizeof(unsigned char));
    fread(imgData, sizeof(unsigned char), width*height, fp);
    fclose(fp);
  
    corners = fast9_detect_nonmax(imgData, width, height, width, threshold, &nCorners);
  
    printf("The number of corners : %d\n", nCorners);
  
    free(corners);
    free(imgData);
}
// 영상의 폭이 4의 배수가 아니면 width와 widthStep이 다른 상황이 발생하기 때문에,
// stride라는 파라미터를 주었지만 예제는 너비가 640이기 때문에 widthStep = width로 하였다.

아래 그림은 왼쪽 영상에 대해 fast9_detect_nonmax를 수행하여 나온 결과를 영상에 표시한 것이다. 
2485개의 corner들이 추출되었다. 


2. OpenCV 연동 버전(추후 설명)
소스 코드 : fast_opencv-1.0.zip
소스 코드내 test.cc 파일 참조
fast-matlab-src-2.1.zip
3.23MB
fast_opencv-1.0.zip
0.03MB
fast-C-src-2.1.zip
0.02MB
fast-matlab-src-2.1.tar.tar
3.23MB
fast-matlab-src-2.1.tar.bz2
1.07MB