When will you grow up?

12. Image Template matching[템플릿 매칭] 본문

02. Study/Computer Vision(openframworks&opencv)

12. Image Template matching[템플릿 매칭]

미카이 2016. 10. 13. 17:57

Template matching?

도형 인식 과정에 의해서 주언 도형(템플릿과 일치하는 도형)을 화상에서 추출하는 조작. 

-출처 : http://terms.naver.com/entry.nhn?docId=1597785&cid=50376&categoryId=50376



말그대로 이미지가 같은 이미지인지 판단을 하는 것입니다.

주어진 작은 이미지가 존재하는지 찾아볼때 주로 사용됨니다.


작업과정

두 가지 주요 구성 요소가 필요합니다.

원본이미지 ,템플릿 이미지(비교 될 패치 화상)


일치하는 영역을 식벽하기 위해서 우리는 원본 이미지에 템플릿 이미지를 비교 합니다.



코드설명 입니다.


//전역 변수로 원본이미지 매칭할 템플이미지 결과 이미지 및 

변수로 이미지매칭 시킬 함수 선언

Mat img; Mat templ; Mat result;
char* image_window = "Source Image";
char* result_window = "Result window";
int match_method;
int max_Trackbar = 5;



//이미지 로드

img = imread("223.JPG");
templ = imread("111.JPG");



//결과 값을 보여줄 window창을 만든다

namedWindow( image_window, WINDOW_AUTOSIZE );

namedWindow( result_window, WINDOW_AUTOSIZE );



//Trackbar생성은 matching 함수에 이용된다.검출 한 경우는 MatchingMethod라고 불림

char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod );


//원본이미지 카피
Mat img_display;
img.copyTo( img_display );


//각 템플릿 위치에 대한 검색 결과를 저장할 결과 행렬을 생성

int result_cols = img.cols - templ.cols + 1;
int result_rows = img.rows - templ.rows + 1;
result.create( result_rows, result_cols, CV_32FC1 );



//템플릿 매칭 작업 

matchTemplate( img, templ, result, match_method );//원본이미지,템플릿이미지 ,                                             //결과,match_method (트랙바))


//결과값 정규화

normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );


//CV : minMaxLoc 를 이용하여 R의 최소값 및 최대값 구하기

double minVal; double maxVal; Point minLoc; Point maxLoc;
Point matchLoc;
minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
//결과이미지 //변수의 결과 최소값 및 최대값 //배열의 최소 및 최대값 점 위치 //옵션 마스크



//matchLoc 변수 값 저장

if( match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED )
{ matchLoc = minLoc; }
else
{ matchLoc = maxLoc; }




//원본 이미지와 결과 이미지 디스플레이 및 가장 높은 매칭 영역 주위에 사각형 생성

rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );
rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );
imshow( image_window, img_display );
imshow( result_window, result );



아래는
원본이미지와 템플릿 이미지 입니다

//원본이미지

//템플릿 이미지





결과






전체 소스 코드입니다.


#include "ofApp.h"

Mat img; Mat templ; Mat result;
const char* image_window = "Source Image";
const char* result_window = "Result window";
int match_method;
int max_Trackbar = 5;
void MatchingMethod(int, void*);
//--------------------------------------------------------------
void ofApp::setup() {
	img = imread("223.JPG");
	templ = imread("111.JPG");
	namedWindow(image_window, WINDOW_AUTOSIZE);
	namedWindow(result_window, WINDOW_AUTOSIZE);
	const char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
	createTrackbar(trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod);
	MatchingMethod(0, 0);
	waitKey(0);
}
void MatchingMethod(int, void*)
{
	Mat img_display;
	img.copyTo(img_display);
	int result_cols = img.cols - templ.cols + 1;
	int result_rows = img.rows - templ.rows + 1;
	result.create(result_rows, result_cols, CV_32FC1);
	matchTemplate(img, templ, result, match_method);
	normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
	double minVal; double maxVal; Point minLoc; Point maxLoc;
	Point matchLoc;
	minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
	if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)
	{
		matchLoc = minLoc;
	}
	else
	{
		matchLoc = maxLoc;
	}
	rectangle(img_display, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(0), 2, 8, 0);
	rectangle(result, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(0), 2, 8, 0);
	imshow(image_window, img_display);
	imshow(result_window, result);
	return;
}
//--------------------------------------------------------------
void ofApp::update() {

}

//--------------------------------------------------------------
void ofApp::draw() {
	
}





출처 : http://docs.opencv.org/3.1.0/de/da9/tutorial_template_matching.html

Comments