이번 포스팅에서는 템플릿 매칭을 사용하여 이미지상에서 오브젝트를 찾는 방법을 다룹니다.
다음 OpenCV Python 튜토리얼을 참고하여 강좌를 비정기적로 포스팅하고 있습니다. https://docs.opencv.org/4.0.1/d6/d00/tutorial_py_root.html |
템플릿 매칭 구현은 다음 링크를 참고하세요.
OpenCV 강좌 - 템플릿 매칭(Template Matching) 구현
https://webnautes.tistory.com/1349
마지막 업데이트 2019. 1. 3
템플릿 매칭은 입력 이미지에서 템플릿 이미지의 위치를 찾는 방법입니다.
OpenCV에서는 템플릿 매칭을 위해 cv.matchTemplate() 함수를 제공합니다.
2차원 컨볼루션처럼 템플릿 이미지를 입력 이미지상 위에서 이동시키면서 대응하는 픽셀들을 비교합니다.
OpenCV에서는 다음 여섯가지 비교하는 방법을 제공합니다.
cv.matchTemplate() 함수는 다음 그림의 왼쪽같은 그레이스케일 이미지를 리턴합니다. 그레이 스케일 이미지의 각 픽셀은 템플릿 이미지와 어느 정도 일치한지를 나타냅니다.
입력 이미지의 크기가 W x H이고 템플릿 이미지의 크기가 w x h라면, 결과 이미지의 크기는 (W-w+1, H-h+1)입니다.
결과 이미지를 얻었다면 cv.minMaxLoc() 함수를 사용하여 최대값과 최소값을 찾을 수 있습니다.
cv.minMaxLoc() 함수는 템플릿과 일치하는 사각 영역의 왼쪽 위 코너 위치를 리턴합니다. 사각 영역의 너비와 높이는 템플릿 이미지에서 가져와 사용합니다.
사용하는 방법에 따라 최대값 또는 최소값의 위치를 왼쪽 위 코너 위치로 사용합니다.
최대값 사용
cv.TM_CCOEFF, cv.TM_CCOEFF_NORMED, cv.TM_CCORR, cv.TM_CCORR_NORMED
최소값 사용
cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED
입력 이미지 템플릿 이미지
템플릿 매칭 예제 코드입니다. 여섯가지 비교 방법을 사용하여 템플릿 매칭을 진행한 결과를 보여줍니다.
import cv2 as cv img = cv.imread('cross.jpg',0)
bottom_right = (top_left[0] + w, top_left[1] + h) plt.subplot(121),plt.imshow(res,cmap = 'gray') |
여섯가지 비교 방법으로 실행된 템플릿 매칭 결과입니다. 하나의 오브젝트만 찾아 줍니다.
cv.minMaxLoc() 함수는 값이 최대 또는 최소인 하나의 위치만 알려주기 때문에 하나 이상의 오브젝트를 템플릿 매칭해야 하는 경우에는 사용할 수 없습니다.
이 경우 쓰레쏠드를 사용하면 됩니다. 다음은 다수의 오브젝트를 찾는 예제 코드입니다.
import cv2 as cv |
실행 결과입니다. 템플릿 매칭은 회전된 오브젝트는 검출하지 못합니다.
테스트에 사용한 이미지입니다.
입력 이미지
템플릿 이미지
'OpenCV > OpenCV 강좌' 카테고리의 다른 글
OpenCV Python 강좌 - Watershed 알고리즘을 사용한 영상 분할(Image Segmentation) (4) | 2019.01.08 |
---|---|
OpenCV Python 강좌 - Distance Transform (0) | 2019.01.08 |
OpenCV Python 강좌 - 8. Hough Line Transform (15) | 2018.12.24 |
성능 좋은 얼굴 인식(Face Recognition) 라이브러리 테스트 (0) | 2018.12.23 |
OpenCV Python 강좌 - 2차원 히스토그램과 Histogram Backprojection (0) | 2018.12.15 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!