파이썬 OpenCV 이미지 서치 - paisseon OpenCV imiji seochi

사장님 몰래 하는 파이썬 업무자동화(부제 : 들키면 일 많아짐) Ch0. 책 소개(집필 목적) 출간 계약 후, 작성중인 저서입니다. Ch2. 목차 및 간략 소개 1-1. 변경 이력 1-2. 책 활용 방법 1-3. 업무자동화 소개(RPA) Ch2. 개발환경 구축 2-1. 파이썬 설치(Anaconda) 2-2. IDE란? 2-3. VS CODE 설치 2-4. VS CODE 사용법 (기초) 2-5. VS CODE 사용법 (디버깅) Ch3. 업무자동화 관련 패키지 3-1. Excel - OpenPyxl 소개 1) 엑셀의 구성요소 2) WorkBook, WorkSheet 객체 설정하기 3) Cell 데이터 읽기/쓰기/삭제 4) rows, columns 속성 이해하기 5) 엑셀 함수 쓰기 - max_row, max_column 속성의 이해 6) 엑셀 서식 지정하기 - 기본 7) 엑셀 서식 지정하기 - 조건부 서식 8) WorkSheet(=Sheet) 조작하기 3-2. Excel - xlwings 소개 1) 엑셀 VBA(Visual Basic for Applicaiton) 소개 2) xlwings 설치 및 Excel 환경설정하기 3) VBA에서 파이썬 코드 실행시키기 4) 파이썬에서 VBA 코드 실행시키기 3-3. Win32com (pywin32) 1) win32com 소개 및 설치 방법 2) win32com 통해 엑셀 다루기 - Cell 데이터 읽기/쓰기 3) win32com 통해 엑셀 다루기 - Cell 영역을 선택하는 방법 4) win32com 통해 엑셀 다루기 - Sheet 제어 5) win32com 통해 엑셀 다루기 - 엑셀 서식 지정 6) win32com 통해 엑셀 다루기 - 차트 7) win32com 통해 엑셀 다루기 - 파일 저장 옵션 9) win32com 통해 전자메일(Outlook) 다루기 3-4. Word문서 자동화 (python-docx) 1) 문서 생성, 저장, 불러오기, 글자 입력 2) 이미지 삽입, 표 삽입 3) 기존문서 내용 읽기 4) 글자 폰트, 크기, 색깔 변경 5) 문단 정렬, 표 셀 정렬 3-5. 파일과 폴더 다루기 1) 경로(path)와 디렉토리(directory) 2) 절대 경로와 상대 경로 3) os 모듈 4) glob 모듈 5) shutil 모듈 3-6. 이미지 처리 1) Pillow 설치 및 이미지 불러오기 2) 이미지 편집(resize,crop,rotate,flip) 3) 이미지 필터 효과(흑백, 블러, 엣지) 4) 이미지 워터마크(텍스트) 5) 이미지 엑셀에 삽입 3-7. PyAutoGUI 모듈 1) 마우스 조작하기 2) 키보드 조작하기 3) 화면 이미지 인식하기 4) 메시지 박스 띄우기 3-8. 웹크롤링 1) 크롬과 크롬 드라이버 2) 속성 HTML/CSS 강의 3) 동적/정적 웹 페이지 4) 정적 웹크롤링 - request / beautifulsoup 5) 정적 웹크롤링 - 텍스트, 하이퍼링크, 이미지 가져오기 6) 동적 웹크롤링 - selenium 소개 및 기초사용법 7) 동적 웹크롤링 - selenium으로 화면 조작하기 8) 동적 웹크롤링 - 텍스트, 하이퍼링크, 이미지 가져오기 3-9. 기타 유용한 패키지 1) zipfile 압축/해제 2) exe 파일 배포 3) 원하는 시간마다 파이썬 자동 실행 4) PDF 다루기 Ch4. 업무자동화 프로젝트 사례 - 작성중 Outlook 첨부 엑셀 파일 데이터 자동 취합하기 개별 파일의 엑셀 시트 새 파일에 취합하기 네이버뉴스 댓글 수집해서 엑셀로 저장하기 실시간으로 네이버 뉴스를 텔레그램으로 전송받기 엑셀 시트를 개별 파일로 분리하기 엑셀 시트별 PDF 자동 저장하기 엑셀의 교육자 명단을 참조하여 수료증(워드) 자동 작성하기

상위 목록: Python 하위 목록: OpenCV 작성 날짜: 2020-04-26 읽는 데 12 분 소요

템플릿 매칭(Template Matching)

파이썬 OpenCV 이미지 서치 - paisseon OpenCV imiji seochi

파이썬 OpenCV 이미지 서치 - paisseon OpenCV imiji seochi

템플릿 매칭원본 이미지에서 템플릿 이미지와 일치하는 영역을 찾는 알고리즘입니다.

원본 이미지 위에 템플릿 이미지를 놓고 조금씩 이동해가며 이미지 끝에 도달할 때 까지 비교해 찾아갑니다.

이 방식을 통해, 템플릿 이미지와 동일하거나, 가장 유사한 영역을 원본 이미지에서 검출합니다.

메인 코드

import cv2

src = cv2.imread("hats.png", cv2.IMREAD_GRAYSCALE)
templit = cv2.imread("hat.png", cv2.IMREAD_GRAYSCALE)
dst = cv2.imread("hats.png")

result = cv2.matchTemplate(src, templit, cv2.TM_SQDIFF_NORMED)

minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)
x, y = minLoc
h, w = templit.shape

dst = cv2.rectangle(dst, (x, y), (x +  w, y + h) , (0, 0, 255), 1)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

세부 코드

src = cv2.imread("hats.png", cv2.IMREAD_GRAYSCALE)
templit = cv2.imread("hat.png", cv2.IMREAD_GRAYSCALE)
dst = cv2.imread("hats.png")

원본 이미지(src)템플릿 이미지(templit)을 선언합니다.

탬플릿 매칭은 그레이스케일 이미지를 사용하므로, cv2.IMREAD_GRAYSCALE를 적용합니다.

결과를 표시할 결과 이미지(dst)를 선언합니다.

result = cv2.matchTemplate(src, templit, cv2.TM_SQDIFF_NORMED)

템플릿 매칭 함수(cv2.matchTemplate)로 템플릿 매칭을 적용합니다.

cv2.matchTemplate(원본 이미지, 템플릿 이미지, 템플릿 매칭 플래그)을 의미합니다.

원본 이미지템플릿 이미지는 8비트의 단일 채널 이미지를 사용합니다.

템플릿 매칭 플래그는 템플릿 매칭에 사용할 연산 방법을 설정합니다.

템플릿 매칭 플래그

플래그수식
cv2.TM_SQDIFF
파이썬 OpenCV 이미지 서치 - paisseon OpenCV imiji seochi
cv2.TM_SQDIFF_NORMED
파이썬 OpenCV 이미지 서치 - paisseon OpenCV imiji seochi
cv2.TM_CCORR
파이썬 OpenCV 이미지 서치 - paisseon OpenCV imiji seochi
cv2.TM_CCORR_NORMED
파이썬 OpenCV 이미지 서치 - paisseon OpenCV imiji seochi
cv2.TM_CCOEFF
파이썬 OpenCV 이미지 서치 - paisseon OpenCV imiji seochi
파이썬 OpenCV 이미지 서치 - paisseon OpenCV imiji seochi
cv2.TM_CCOEFF_NORMED
파이썬 OpenCV 이미지 서치 - paisseon OpenCV imiji seochi

반환되는 결괏값(dst)은 32비트의 단일 채널 이미지로 반환됩니다.

또한, 배열의 크기는 W - w + 1, H - h + 1의 크기를 갖습니다.

(W, H)는 원본 이미지의 크기이며, (w, h)는 템플릿 이미지의 크기입니다.

결괏값이 위와 같은 크기를 갖는 이유는 원본 이미지에서 템플릿 이미지를 일일히 비교하기 때문입니다.

예를 들어, 4×4 크기의 원본 이미지와 3×3 크기의 템플릿 이미지가 있다면 아래의 그림과 같이 표현할 수 있습니다.

파이썬 OpenCV 이미지 서치 - paisseon OpenCV imiji seochi

4번의 비교를 진행할 수 있으며, 이를 배열로 옮긴다면 2×2 크기를 갖게 됩니다.

수식으로 다시 표현한다면, \((W - w + 1, H - h + 1) = (4 - 3 + 1, 4 - 3 + 1) = (2, 2)\)가 됩니다.

minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)
x, y = minLoc
h, w = templit.shape

결괏값(dst)에서 가장 유사한 부분을 찾기 위해 최소/최대 위치 함수(cv2.minMaxLoc)로 검출값을 찾습니다.

최소/최대 위치 함수최소 포인터, 최대 포인터, 최소 지점, 최대 지점을 반환합니다.

검출 위치의 좌측 상단 모서리 좌표는 최소 지점(minLoc)이나 최대 지점(maxLoc)에 위치합니다.

템플릿 이미지를 일일히 비교하므로, 이미지 크기는 템플릿 이미지와 동일합니다.

  • Tip : cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED최소 지점(minLoc)이 검출된 위치입니다.

  • Tip : cv2.TM_CCORR, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF, cv2.TM_CCOEFF_NORMED최대 지점(maxLoc)이 검출된 위치입니다.

dst = cv2.rectangle(dst, (x, y), (x +  w, y + h) , (0, 0, 255), 1)

검출된 결과를 결과 이미지(dst)위에 표시합니다.

출력 결과

파이썬 OpenCV 이미지 서치 - paisseon OpenCV imiji seochi