템플릿 매칭은 복잡한 전처리 없이도
특정 이미지 조각이 큰 이미지 안에서 어디에 위치해 있는지를
찾을 수 있는 간단하지만 유용한 기법입니다.
특히 UI 자동화, 부품 검사, 아이콘 추적, 게임 화면 분석 등에 자주 활용되요.
템플릿 매칭이란 무엇인가요?
템플릿 매칭은 하나의 작은 이미지(템플릿)를 큰 이미지 안에서 찾아내는 기법이에요.
일치하는 위치를 찾기 위해 슬라이딩 윈도우 방식으로 비교가 진행되며,
정확히 일치하거나 유사한 패턴을 찾는 데 유용해요.
이미지의 회전이나 크기 변화에는 민감하지만,
간단하고 직관적인 구조 덕분에 다양한 분야에서 쓰이고 있어요.
OpenCV에서는 matchTemplate() 함수를 통해 쉽게 구현할 수 있고,
결과는 유사도 맵 형태로 반환돼요.
가장 유사한 좌표를 찾으려면 minMaxLoc() 함수를 함께 사용해요.
기본 템플릿 매칭 예제
cv::Mat img = cv::imread("scene.jpg"); cv::Mat templateImg = cv::imread("icon.jpg"); cv::Mat result; cv::matchTemplate(img, templateImg, result, cv::TM_CCOEFF_NORMED); cv::Point maxLoc; cv::minMaxLoc(result, 0, 0, 0, &maxLoc); cv::rectangle(img, maxLoc, maxLoc + cv::Point(templateImg.cols, templateImg.rows), cv::Scalar(0,255,0), 2); cv::imshow("Matched", img); cv::waitKey(0); |
이 코드는 icon.jpg가 scene.jpg 내 어디에 있는지 찾아서 초록색 사각형으로 표시해줘요.
TM_CCOEFF_NORMED는 정규화된 상관계수 기반의 매칭 방식입니다.
매칭 방법 선택과 차이점
OpenCV는 총 6가지의 템플릿 매칭 방식을 제공해요.
cv::TM_SQDIFF, cv::TM_SQDIFF_NORMED는 제곱 차이 기반으로
값이 작을수록 더 일치하고, 나머지는 값이 클수록 더 일치해요.
- TM_CCOEFF_NORMED: 가장 일반적으로 많이 사용됨
- TM_CCORR_NORMED: 밝기에 민감함
- TM_SQDIFF: 노이즈 많은 환경에서 유리
실험적으로 여러 방법을 적용해서 가장 잘 동작하는 방식으로 선택하는 게 중요해요.
템플릿 매칭에서 신뢰도 점수 활용 예제
cv::Mat result; cv::matchTemplate(img, templateImg, result, cv::TM_CCOEFF_NORMED); cv::Point matchLoc; double maxVal; cv::minMaxLoc(result, 0, &maxVal, 0, &matchLoc); if (maxVal > 0.8) { // 신뢰도 기준 cv::rectangle(img, matchLoc, matchLoc + cv::Point(templateImg.cols, templateImg.rows), cv::Scalar(255, 0, 0), 2); } |
이 예제는 유사도 점수가 0.8 이상일 경우에만 매칭으로 인정하고 사각형을 그려줘요.
이렇게 하면 잘못된 매칭을 어느 정도 걸러낼 수 있어요.
템플릿 매칭의 한계와 개선 전략
템플릿 매칭은 빠르고 직관적이지만, 회전, 크기 변화, 조명 변화에 민감하다는 단점이 있어요.
따라서 회전된 객체를 찾아야 한다면 ORB, SIFT, 또는 딥러닝 기반 방법으로 전환하는 게 더 좋아요.
또, 다중 객체가 있을 경우에는 threshold()나 findNonZero()를 이용해서
여러 위치를 동시에 찾는 구조도 구현할 수 있어요.
템플릿 자체를 여러 크기로 리사이즈하여 멀티스케일 매칭을 적용하면 크기 변화에도 어느 정도 대응 가능해요.
이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~
'IT' 카테고리의 다른 글
OpenCV에서 히스토그램 역투영 기법 사용하기 (0) | 2025.06.27 |
---|---|
OpenCV Hough 변환을 활용한 직선 및 원 검출 (0) | 2025.06.27 |
OpenCV에서 윤곽선(contour) 검출과 그리기 (0) | 2025.06.26 |
OpenCV로 엣지 검출: Canny 알고리즘 설명과 활용 (0) | 2025.06.26 |
OpenCV로 밝기 및 대비 조절하기 (0) | 2025.06.26 |