본문 바로가기

CLASS

[OpenCV] OpenCV 를 이용한 템플릿 매칭(Template Matching) 하기 (소스포함)

OpenCV 를 이용한 템플릿 매칭(Template Matching) 하기
대한민국 최고 영상처리 커뮤니티 OpenCV Korea - http://opencv.co.kr

OpenCV 를 이용하여 간단한 템플릿 매칭(Template Matching)을 해보도록 하겠습니다. 먼저 2가지 준비물을 챙겨오시기 바랍니다.

  A. 소스 이미지 : 어지럽혀진 책상과 같은 장면을 디카로 찍습니다.
  B. 찾고자 하는 물체 이미지 : 사진에서 찾고자 하는 물체를 포토샵으로 따로 저장합니다.

템플릿 매칭의 세계로 입문할 준비가 되셨나요? 미처 준비물을 준비하지 못하신 분들을 위해 아래에 보시면 소스들을 준비해 두었습니다. 필요하신 분께선 다운받아 마음껏 사용하세요. 템플릿 매칭은 간단하게 딱 2단계로 설명을 하겠습니다.

1단계 : 유사성(Similarity) 찾기
이제부터 우리는 템플릿 매칭을 수행하기위해 OpenCV 함수중
cvMatchTemplate()
이란 함수를 이용하여 A 와 B 의 상관계수 맵(Coefficient Map)을 구할 것입니다. 이 함수의 Key point 는 A 이미지 전체를 탐색하면서 B 이미지와 각각 얼마만큼 유사성(Similarity)이 있는지를 구하는 것 입니다. 유사성을 구하는 방법에는 유클리디안(Euclidean)법 등을 이용( R(x,y)=sumx',y'[T(x',y')-I(x+x',y+y')]2 ) 합니다. OpenCV Document 를 보면 공식이 각각의 방법에 대해 자세히 나와있습니다.

2단계 : 최대값(Maximum value) 찾기
1단계에서 구한 상관계수 맵에서 최대의 유사성을 갖는 값(Maximum value)을 찾아 사각형으로 표시하면 가장 유사한 물체를 찾게 된 것입니다. OpenCV 에서는 최대최소값을 찾는 것 조차도 간단하게 cvMinMaxLoc() 함수를 제공하여 찾을 수 있도록 해주었습니다. 가끔은 이런 함수들이 있다는 것을 인지해야 하고 사용법일 익히는게 더 어렵고 그냥 코딩하는게 더 쉬울때도 있습니다. 하지만 이런 함수들은 나중에 프로젝트 개발시 시간을 단축시켜 주는 뛰오난 효과가 있지요.

다음은 소스 코드 입니다.

void main()
{
  double min, max;
  CvPoint left_top;

  IplImage *A = cvLoadImage("My_Desk.jpg", -1); // 책상(A)을 먼저 읽고
  IplImage *B = cvLoadImage("Stapler.jpg", -1); // 스테이플러(B)를 읽는다.
  IplImage* C = cvCreateImage( cvSize( A->width - B->width+1, A->height - B->height+1 ), IPL_DEPTH_32F, 1 );
// 상관계수를 구할 이미지(C)

  cvMatchTemplate(A, B, C, CV_TM_CCOEFF_NORMED); // 상관계수를 구하여 C 에 그린다.
  cvMinMaxLoc(C, &min, &max, NULL, &left_top); // 상관계수가 최대값을 값는 위치 찾기
  cvRectangle(A, left_top, cvPoint(left_top.x + B->width, left_top.y + B->height), CV_RGB(255,0,0));
// 찾은 물체에 사격형을 그린다.

  Show("T9-result",A); // 결과 보기
  Show("T9-sample",B); // 스테이플러(B) 보기
  Show("C",C);  
// 상관계수 이미지 보기
  cvWaitKey(0);

  // 모든 이미지 릴리즈
  cvReleaseImage(&A);
  cvReleaseImage(&B);
  cvReleaseImage(&C);

  // 모든 윈도우 제거
  cvDestroyAllWindows();
}



다음은 준비물로 필요한 샘플 이미지와 결과물 입니다.

- A. 나의 책상 이미지


- B. 찾고자 하는 스테이플러 이미지


- C. 상관계수가 그려진 이미지


- 결과 이미지, 찾은 부분을 빨간 사각형으로 표시



- 소스 코드 및 데모 프로그램 다운받기(마우스 우클릭, 다른이름으로 저장)
http://opencv.co.kr

T9-Template_Matching.zip




Copyright (c) 2006 Dong-Chul Kim.
대한민국 최고 영상처리 커뮤니티 OpenCV Korea - http://opencv.co.kr