코드 13-1 템플릿 매칭 예제 [ch13/template]
01 void template_matching() 02 { 03 Mat img = imread("circuit.bmp", IMREAD_COLOR); 04 Mat templ = imread("crystal.bmp", IMREAD_COLOR); 05 06 if (img.empty() || templ.empty()) { 07 cerr << "Image load failed!" << endl; 08 return; 09 } 10 11 img = img + Scalar(50, 50, 50); 12 13 Mat noise(img.size(), CV_32SC3); 14 randn(noise, 0, 10); 15 add(img, noise, img, Mat(), CV_8UC3); 16 17 Mat res, res_norm; 18 matchTemplate(img, templ, res, TM_CCOEFF_NORMED); 19 normalize(res, res_norm, 0, 255, NORM_MINMAX, CV_8U); 20 21 double maxv; 22 Point maxloc; 23 minMaxLoc(res, 0, &maxv, 0, &maxloc); 24 cout << "maxv: " << maxv << endl; 25 26 rectangle(img, Rect(maxloc.x, maxloc.y, templ.cols, templ.rows), Scalar(0, 0, 255), 2); 27 28 imshow("templ", templ); 29 imshow("res_norm", res_norm); 30 imshow("img", img); 31 32 waitKey(0); 33 destroyAllWindows(); 34 }
• 3행 circuit.bmp 파일을 입력 영상 img로 사용합니다.
• 4행 crystal.bmp 파일을 템플릿 영상 templ로 사용합니다.
• 11행 입력 영상 밝기를 50만큼 증가시킵니다.
• 13~15행 입력 영상에 표준 편차가 10인 가우시안 잡음을 추가합니다.
• 18행 정규화된 상관계수 매칭 방법을 사용하여 템플릿 매칭을 수행합니다.
• 19행 템플릿 매칭 결과 행렬 res의 모든 원소 값을 0~255 사이로 정규화하고, 타입을 CV_8UC1로 변환하여 res_norm 영상에 저장합니다.
• 21~23행 res 행렬에서 최댓값 위치를 찾아 maxloc에 저장합니다. 이 위치에서의 최댓값 maxv는 템플릿 매칭이 잘 되었는지를 가늠하는 척도로 사용할 수 있습니다.
• 24행 res 행렬의 최댓값을 콘솔 창에 출력합니다.
• 26행 img 영상에 템플릿 매칭으로 찾은 위치를 빨간색 사각형으로 표시합니다.