[OpenCV] 템플릿 매칭 – matchTemplate

이번 글에서는 템플릿 매칭(Template Maching)에 대해 알아보겠습니다.

템플릿 매칭이란 어떠한 영상에서 템플릿 영상과 일치하는 영상을 찾는 것을 말합니다. 
템플릿 영상은 찾을 대상이 되는 작은 크기의 영상을 의미합니다.

예를들어 아래와 같이 레나 영상에서 레나 얼굴을 찾고 싶으면, 레나의 얼굴 크기만한 템플릿 영상을 전체 영상 영역을 이동하면서 유사도와 비유사도를 계산하여 찾아냅니다.

유사도는 템플릿 영상과 비슷한 부분에서 값이 크게 나타나며, 비유사도는 비슷한 부분에서 값이 작게 나타납니다.

OpenCV에서는 matchTemplate 함수를 제공하여 템플릿 매칭을 수행합니다.

/** 
@param image 입력 영상
@param templ 템플릿 영상
@param result 결과를 저장할 행렬
@param method 템플릿 매칭 방법
@param mask 찾을 템플릿의 마스크 영상.
 */
void matchTemplate( InputArray image, InputArray templ, OutputArray result, int method, InputArray mask = noArray() );

마지막 파라미터 mask 옵션은 TemplateMatchModes 열거형을 보시면 됩니다.

TemplateMatchModes 설명수식
TM_SQDIFF제곱차 매칭 방법
TM_SQDIFF_NORMED정규화된 제곱차 매칭 방법
TM_CCORR상관관계 매칭 방법
TM_CCORR_NORMED정규화된 상관관계 매칭 방법
TM_CCOEFF상관계수 매칭방법
TM_CCOEFF_NORMED정규화된 상관계수 매칭 방법

아래는 샘플 코드입니다.

Mat img = imread("lenna.bmp", IMREAD_COLOR);
Mat templ = imread("lenna_template.bmp", IMREAD_COLOR);

if (img.empty() || templ.empty())
{
	cerr << "image load fail" << endl;
	return -1;
}

// 템플릿 매칭하기
Mat res;
matchTemplate(img, templ, res, TM_CCOEFF_NORMED);

// 영상중 최대값 구하기
double maxv; // 최대값
Point maxloc; // 최대값 위치
minMaxLoc(res, 0, &maxv, 0, &maxloc);
cout << "maxv: " << maxv << endl; // 최대값 출력

// 영상에 네모 표시
rectangle(img, Rect(maxloc.x, maxloc.y, templ.cols, templ.rows), Scalar(0,0,255), 2);

imshow("templ", templ);
imshow("img", img);

// 결과값을 영상으로 보기위해 0~255 값으로 정규화
Mat res_norm;
normalize(res, res_norm, 0, 255, NORM_MINMAX, CV_8U);
imshow("res_norm", res_norm);

waitKey();
destroyAllWindows();

위 코드를 실행하면 아래와 같이 표시됩니다.