더북(TheBook)

코드 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 영상에 템플릿 매칭으로 찾은 위치를 빨간색 사각형으로 표시합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.