차근차근/OpenCV

OpenCV를 이용한 Template Matching

예쁜꽃이피었으면 2014. 8. 6. 17:23

http://mgkim.egloos.com/580818


1. HVR-2030R RDK를 이용하여 이미지를 캡쳐한 후, JPG로 저장 [ ->소스 ]
2. 포토샵을 이용하여 소스 이미지에서 템플릿을 추출하여 JPG로 저장. [ ->템플릿 ]
여기서는 "tsukuba.jpg"를 소스 이미지로 사용하고, 이미지 내의 깡통을 템플릿으로 하여 찾아본다.

템플릿 매칭 알고리즘에 대해 간단히 설명해보도록 하자.
템플릿 매칭을 수행하기위해 cvMatchTemplate() 이란 함수를 이용하여 소스와 템플릿의 상관계수 맵(Coefficient Map)을 구한다. 이 함수의 특징은  유클리디안 거리를 사용하여 소스 이미지 전체를 탐색하면서 템플릿 이미지와 얼마나 유사한지를 측정하는 것이다. 
여기서 구한 상관계수 맵에서 최대의 유사성을 갖는 값(Maximum value)을 cvMinMaxLoc() 함수를 이용하여 찾아서, 사각형 박스로 표시하면 육안으로도 쉽게 식별할 수 있겠다.

소스코드는 다음과 같다.

#include <cv.h>
#include <highgui.h>

void Show(char *str, IplImage *img)
{
    cvNamedWindow( str, 1);
    cvShowImage( str, img );
}

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

    // 먼저, source image를 로드한 후,
    IplImage *src = cvLoadImage("tsukuba.jpg", -1);


    // template image를 로드한다. 
    IplImage *temp = cvLoadImage("can.jpg", -1);
 
    // 상관계수를 구할 이미지
    IplImage *coeff = cvCreateImage( cvSize( src->width - temp->width+1, 
                             src->height - temp->height+1 ), IPL_DEPTH_32F, 1 );


    // 상관계수를 구하여 coeff에 그려준다.
    cvMatchTemplate(src, temp, coeff, CV_TM_CCOEFF_NORMED); 


    // 상관계수가 최대값을 가지는 위치를 찾는다 
    cvMinMaxLoc(coeff, &min, &max, NULL, &left_top); 

    // 찾은 물체에 사격형 박스를 그린다.
    cvRectangle(src, left_top, cvPoint(left_top.x + temp->width, 

                      left_top.y + temp->height), CV_RGB(255,0,0));

    Show("Matching Result", src);  // 매칭 결과 이미지
    Show("Template", temp);        // 템플릿 이미지
    Show("Coefficient", coeff);      // 상관계수 이미지 보기

    cvWaitKey(0);
  
    cvReleaseImage(&src);
    cvReleaseImage(&temp);
    cvReleaseImage(&coeff);

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


템플릿 매칭 결과 이미지...


상관계수 이미지... 


반응형