12. Image Template matching[템플릿 매칭]
Template matching?
도형 인식 과정에 의해서 주언 도형(템플릿과 일치하는 도형)을 화상에서 추출하는 조작.
-출처 : http://terms.naver.com/entry.nhn?docId=1597785&cid=50376&categoryId=50376
말그대로 이미지가 같은 이미지인지 판단을 하는 것입니다.
주어진 작은 이미지가 존재하는지 찾아볼때 주로 사용됨니다.
작업과정
두 가지 주요 구성 요소가 필요합니다.
원본이미지 ,템플릿 이미지(비교 될 패치 화상)
일치하는 영역을 식벽하기 위해서 우리는 원본 이미지에 템플릿 이미지를 비교 합니다.
코드설명 입니다.
//전역 변수로 원본이미지 매칭할 템플이미지 결과 이미지 및
변수로 이미지매칭 시킬 함수 선언
//이미지 로드
//결과 값을 보여줄 window창을 만든다
namedWindow( image_window, WINDOW_AUTOSIZE );
namedWindow( result_window, WINDOW_AUTOSIZE );
//Trackbar생성은 matching 함수에 이용된다.검출 한 경우는 MatchingMethod라고 불림
//템플릿 매칭 작업
matchTemplate( img, templ, result, match_method );//원본이미지,템플릿이미지 , //결과,match_method (트랙바))
//결과값 정규화
normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );
//CV : minMaxLoc 를 이용하여 R의 최소값 및 최대값 구하기
//원본 이미지와 결과 이미지 디스플레이 및 가장 높은 매칭 영역 주위에 사각형 생성
//원본이미지
//템플릿 이미지
결과
전체 소스 코드입니다.
#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