본문 바로가기

강의

[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
  • 노형석 2007.12.03 17:04

    재밌게 보았습니다.. ㅎㅎ

    이런 템플릿 매칭을 실시간에서 오브젝트 디텍팅 혹은 트랙킹에 쓰기엔..

    조금 무리가 있겠죠?

    스케일도 있고..공처럼 굴러간다면..

    물론 피라미드를 쓰면 스케일 부분은 어느정도 해결될듯 보이지만. ㅎㅎ

    그냥 막연한 생각이었습니다. 아직 초심자라서요..

    영상처리 공부한지 1년도채 되지 않았고..

    강의 또한 들어본적이 없어서요^^;;

    연구실도 제어쪽입니다 ㅠㅠ

  • BlogIcon windheim 2008.12.05 15:28

    고맙습니다. 이 패턴 매칭 예제와 카메라 출력 예제를 조합해서 10분만에 웹켐을 사용한 오브젝트 트랙킹 코드를 만들었습니다. OpenCV는 정말 강력하군요. ^^

  • Sixplex 2009.09.16 17:40

    도움이 많이 되었습니다. 감사합니다^^

  • darkdevilness 2011.06.13 11:31

    처음 접하는 사람에게는 자신감을 심어주는 Source를 올려주셔 서 감사합니다.
    Webcam 사용하는 Source와 Template Matching source 두개를 잘 조합을 하니.
    webcam으로 들어 오는 제 얼굴을 Tracking 하네요, 신기함, 함수 몇개로 하다니 , 예전에는 엄두도 못내던 것을.
    열공하세요,, 욕심이지만, 좋은 자료 부탁드립니다.

  • Vincent 2011.06.16 09:16

    잘봤습니다.
    그런데 질문이있습니다.

    저 사진에 있는 주황색 스템플러가아닌 임으로 파란색 스템플러(색만 다른 똑같은 모양의 스템플러)를 약간 다른방향으로 이미지를 뜨고, 매칭을 시켜도 저 스템플러를 잡을수있습니까?

  • OpenCTRL 2011.10.10 21:59

    T9T9님 안녕하세요 @_@;

    대한민국 최고 영상처리 까페에서 티구티구님의 캠 켜는것부터

    갖가지 강좌들 죄다 찾아보고 홀로 공부하는데

    정말 많은 도움이 되었습니다.. 정말 감사합니다..

    감사합니다.

    저.. 궁금한 점이 있는데..

    오픈씨브이에서 제공해 주는 함수를 사용하였을때 장점은 티구님 글에서 보았습니다.

    하지만 오픈씨브이에서 제공해 주지 않는 함수를 사용하지 않고 한다면,, 어떤점에서

    좋은지 궁금합니다.. 예를 들면 군더더기 없이 처리 속도를 더 빠르게 할 수 있는지..

  • 지나가는행인1 2015.03.30 07:20

    관리자의 승인을 기다리고 있는 댓글입니다

  • BlogIcon 이제막프밍중 2015.05.26 19:03

    관리자의 승인을 기다리고 있는 댓글입니다