http://aidiary.hatenablog.com/entry/20091024/1256384360
3 일에 만드는 고속 특정 물체 인식 시스템 (1) 물체 인식이란 (2009-10-18)의 연속이다.
이번에는 이미지에서 SIFT (Scale-Invariant Feature Transform)이라는 국소 특징 량을 추출하는 곳을 만들어 보려고합니다.
SIFT 특징 량 추출
우선 국소 특징 량의 대표라고도 할 수 SIFT를 시도합니다. OpenCV에는 SIFT를 추출하는 함수가 없었기 때문에 Rob Hess 씨가 C 언어로 구현 한 라이브러리를 시도합니다. 내부에서 OpenCV를 사용하고 있으므로 사전에 OpenCV의 설치가 필요합니다. 구현은 OpenCV 1.1에서되는 것 같습니다만, 2.0에서도 조금 재 작업과 움직였습니다. Rob Hess 씨의 홈페이지 에서 SIFT Feature Detector의 zip 버전을 떨어 뜨립니다.
(주) Hess 씨의 사이트가 업데이트 된 것을 현재는 GitHub에 OpenSIFT 라는 프로젝트로 출판하고 있습니다.
압축을 풀면 여러 파일이 있지만 SIFT를 추출하는 데 필요한 최소는
siftfeat.c - 메인 함수 sift.c sift.h - SIFT 추출 용 함수 imgfeatures.c imgfeatures.h - SIFT 특징 량을 그리기 저장하는 함수 utils.c utils.h - 유틸리티 함수 beaver.png - 테스트 이미지
입니다. 이것들을 자신의 프로젝트에 추가합니다. OpenCV2.0에서 컴파일하면 몇 가지 오류가 나온 * 1 때문에 치유합니다. imgfeatures.c의 373 번째 줄을
cvEigenVV (& M & V & E, DBL_EPSILON , 0 , 0 );
siftfeat.c의 28, 29 번째 줄을
char * img_file_name = "beaver.png" ; char * out_file_name = "beaver.sift" ;
또한 72 번째 줄을
cvSaveImage (out_img_name, img, 0 );
수정합니다. 아직 여러 가지 경고는 나오지만 일단 컴파일 할 수 있습니다. beaver.png라는 이미지에서 실행하면 아래와 같은 이미지가 표시됩니다.
화살표의 시작점은 키포인트의 위치, 화살표의 길이는 스케일, 화살표의 방향은 경사 강도가 가장 강한 방향을 나타내고있는 것입니다. SIFT의 표시 방법은 키포인트의 점만 표시 화살표로 표시, 원으로 표시 등 여러 가지 같네요. 스케일이나 경사 강도가 무엇을 의미하는지는 좀 더 조사가 필요합니다. 당면은 SIFT의 키포인트의 위치와 각각의 점이 128 차원의 특징 벡터로 나타낼 수 만 억제두면 좋을까?
각각의 키 포인트 128 차원 벡터, beaver.sift라는 파일에 저장되어 있습니다. 화살표 1 개에 대해 128 개의 숫자 (128 차원 벡터)입니다. 아래와 같은 파일입니다.
114 128 <--- 키포인트의 수와 특징 벡터의 차원 수 101.350182 136.130755 40.169879 0.771085 <--- 첫 번째 키포인트의 X 좌표, Y 좌표, 스케일, 방향 0 0 0 0 3 1 0 0 2 23 46 15 18 3 0 0 6 20 13 1 <--- 들여 쓰기 된 숫자가 128 차원 벡터 (20 개에서 줄을 서기) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 88 36 0 0 81 95 57 47 185 114 2 7 185 155 19 6 19 6 1 22 22 0 0 0 0 0 0 1 0 0 0 0 37 8 0 0 91 12 0 1 185 144 11 35 185 50 0 0 23 28 8 95 40 1 0 0 0 0 0 4 0 0 0 0 0 0 0 0 11 5 0 0 4 2 0 0 49 20 0 0 1 0 0 1 0 0 0 0 0 0 0 0 127.871536 71.100579 15.768590 -2.024589 <--- 두 번째 키 포인트 1 2 2 72 63 12 1 1 133 93 1 4 2 7 4 44 133 115 0 0 0 0 0 20 9 4 0 0 0 0 0 0 23 0 1 9 107 20 1 8 133 5 0 0 0 1 5 133 132 14 0 0 0 0 8 133 14 1 0 0 0 0 0 8 26 0 0 0 126 37 8 22 133 47 0 0 0 0 0 52 131 41 0 0 0 0 2 36 1 0 0 0 0 0 0 2 2 0 0 0 34 105 80 24 111 15 0 0 0 1 55 66 79 21 0 0 0 0 0 5 0 0 0 0 0 0 0 0
위 이미지의 경우 128 차원 벡터 114 개에 의해 표현 될거야. 이 128 차원 벡터 114 개를 물체 모델 데이터베이스에 등록 할 수 있습니다. 꽤 엄청난 수치입니다. 이 파일을 잘 관찰하면 아무래도 키 포인트는 스케일이 큰 순서 (화살표가 긴 순서)에 줄 지어있는 것을 알 수 있습니다. 이것은 또한 아직 잘 알지 않습니다 만, 규모가 큰 키 포인트 가량 중요한 것으로 해석 할 수있다 있을까요? 만약 전체 분이 있으면 조언하십시오.
키포인트를 점으로 그리기
여기서 조금 개조 해보십시오. 키포인트를 화살표가 아닌 점 표시하고 SIFT 파일이 한 줄에 하나의 키 포인트 정보 를 나타내도록합니다. imgfeature.c의 595 번째 줄을
/ / cvLine (img start, end, color, 1, 8, 0); / / cvLine (img, end h1, color, 1, 8, 0); / / cvLine (img, end h2, color, 1, 8, 0); cvCircle (img, cvPoint (start_x, start_y), 2 , cvScalar ( 0 , 255 , 255 , 255 ) - 1 , 0 , 0 );
로 동일한 파일의 523 번째 줄 (숫자 20 개마다 줄 바꿈을 넣는 부분)을 주석 처리합니다.
/ / if (j % 20 == 0) / / fprintf (file, "\ n");
이렇게하면 아래와 같이 키 포인트가 점입니다. beaver.sift 하나의 키 포인트 정보가 한 줄로 정리합니다. 스크립트에서 처리 할 때 여기가 편하다고 생각합니다.
일부 이미지에서 SIFT 키포인트를 그려 봅니다. SIFT가 이미지의 어떤 곳을 키포인트하고 있을까 대략 상상 대해서는군요. 음양 마크처럼별로 모양이없는 이미지가 키포인트가 적게되기 십상 것 같습니다.
SIFT에 대한 자세한
SIFT의 키포인트는 이미지의 특징을 잘 나타내고있는 위치 는 것은 알았습니다. 그럼, 어떤 근거에 따라 그 점이 선정되었는지? 128 차원 벡터가 어떤 식으로 요구 했는가? 알고리즘의 세부 사항을 자세하게 조사 할 필요가 있습니다. SIFT는 상당히 복잡한 일을하고 있고, 가우스 스무딩 필터, Difference of Gaussian (DoG), 국 값 감지, 이미지 미분 강도 기울기 등 영상 처리 이론을 알고 있지 않으면 이해가 어렵다 · · · 나는 아직 어렴풋이 이론이 밝혀졌다 정도입니다.
하나 착각하고 있었던 것은, SIFT는 색상 정보를 사용하지 않기 이라는 것일까. 실제로 그레이 스케일 이미지에서 추출하고 있습니다. 일부 참고 한 자료들이다. 이들을 추천 그중 C + + 버전의 SIFT를 만들어 보려고합니다.
3 일에 만드는 고속 특정 물체 인식 시스템 (3) SURF 추출 (2009-10-30)에 계속됩니다.
- SIFT 연습 - 후지 요시 박사의 SIFT 해설 자료, 그림이 풍부하고 알기 쉽다.
- SIFT를 1에서 파트너 블로그 - 단계적으로 조금씩 구현하고 있으므로 알기 쉽다. 도중에 라라라 ♪라고 다지 있지만 (웃음)
- Rob Hess 씨의 SIFT 특징 량 추출 모듈 사용해 보면 - Rob Hess 씨의 프로그램의 실행 방법입니다.
- SIFT + - 다른 구현. 이쪽도 시험해보고 싶다.
- SIFT for Matlab - Matlab의 구현.
- Scale-invariant feature transform - Wikipedia의 기사.
- Keypoint detector - SIFT 제안자 Lowe 씨의 데모.
- DG Lowe : Object recognition from local scale-invariant features (PDF), Proc. of IEEE Intl. Conf. on Computer Vision (ICCV), pp.1150-1157 (1999) - SIFT의 원 논문
- D. Lowe : Distinctive imagefeatures from scale-invariant keypoints (PDF), Proc. of Intl. Journal of Computer Vision (IJCV), 60 (2), pp.91-110 (2004) - SIFT의 원 논문
'차근차근 > OpenCV' 카테고리의 다른 글
error C2057: 상수 식이 필요합니다. (0) | 2014.07.30 |
---|---|
3 일에 만드는 고속 특정 물체 인식 시스템 (1) 물체 인식 시스템 (0) | 2014.07.30 |
3 일에 만드는 고속 특정 물체 인식 시스템 (3) SURF 추출 (0) | 2014.07.30 |
3 일에 만드는 고속 특정 물체 인식 시스템 (4) 특징점의 매칭 (0) | 2014.07.30 |
3 일에 만드는 고속 특정 물체 인식 시스템 (5) 물체 모델 데이터베이스 만들기 (0) | 2014.07.30 |