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

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