템플릿 매칭이란?
템플릿 매칭이란 OpenCV의 함수중의 하나로, 이미지에서 템플릿 이미지와 유사한 영역을 찾아내는 방법으로,
템플릿 이미지를 입력 이미지에서 이동시켜가면서 템플릿 이미지와 일치, 혹은 유사한 영역을 검출합니다.
이는 오토핫키의 이미지서치와 비슷해보이지만, 여러가지 차이점이 있습니다.
오토핫키의 이미지 서치는 검색 이미지와 완벽히 1대1로 매치되는 이미지를 검색하며, 조금이라도 픽셀값이 다르거나 하면 이미지를 검출해내지 못합니다.
그에 반해 템플릿 매칭은 이미지가 완벽히 1대1로 매치되지 않더라도, 비슷한 이미지를 검출해 내는것이 가능합니다.
이러한 차이점 때문에 두가지 이미지 대조방식을 상황에 따라 적절히 사용하면 보다 높은 활용성을 얻을 수 있습니다.
OpenCV의 템플릿 매칭 함수는 총 6가지의 Method를 제공합니다.
1. TM_SQDIFF
2. TM_SQDIFF_NORMED
3. TM_CCORR
4. TM_CCORR_NORMED
5. TM_CCOEFF
6. TM_CCOEFF_NORMED
[참조 : https://docs.opencv.org/master/d4/dc6/tutorial_py_template_matching.html]
라이브러리 함수
기본적으로 OpenCV에서는 오토핫키를 위한 모듈을 따로 지원하진 않지만, 오토핫키에서 또한 DllCall을 이용해 사용이 가능합니다.
제작된 라이브러리 사용 환경은 AutoHotkey 32bit, 64bit / Window 10 입니다. [2020 09 02 업데이트]
Window 7 의 경우, Visual C++ Redistributable 패키지를 설치하시면 이용이 가능합니다
라이브러리의 함수는 다음과 같습니다.
1. TemplateMatch(ByRef Out_X, ByRef Out_Y, Find_X1, Find_Y1, Find_X2, Find_Y2, SearchImage, Method)
: 전체 화면으로 부터 단일 이미지를 검색합니다
2. MultiTemplateMatch(Find_X1, Find_Y1, Find_X2, Find_Y2, Threshold, SearchImage, Method)
: 전체 화면으로 부터 다중 이미지를 검색합니다
3. TemplateMatchFromImage(InputImage, SearchImage, ByRef Out_X, ByRef Out_Y, Method)
: 이미지파일로 부터 단일 이미지를 검색합니다
4. MultiTemplateMatchFromImage(InputImage, SearchImage, Threshold, Method)
: 이미지파일로 부터 다중 이미지를 검색합니다
5. TemplateMatchFromHWND(ByRef Out_X, ByRef Out_Y, HWND, SearchImage, Method)
: HWND값으로 부터 단일 이미지를 검색합니다
6. MultiTemplateMatchFromHWND(HWND, Threshold, SearchImage, Method)
: HWND값으로 부터 다중 이미지를 검색합니다
MaxVal := TemplateMatch(OutputVarX, OutputVarY, X1, Y1, X2, Y2, SearchImage [, Method])
MaxVal
일치율을 반환합니다 Method에 따라 각기 다른 형태를 지닙니다
OutputVarX/Y
화면에서 이미지가 발견된 X, Y 좌표를 저장할 변수의 이름
X1, Y1, X2, Y2
검색을 진행할 범위
SearchImage
검색할 이미지의 파일 이름. 경로를 지정하지 않으면 %A_WorkingDir% 에 있다고 간주합니다
Method
검출하는 Method. 비워둘시 TM_SQDIFF Method를 채택합니다
OutputVarXY := MultiTemplateMatch(X1, Y1, X2, Y2, Threshold, SearchImage [, Method])
OutputVarXY
이미지가 발견된 X, Y 좌표를 X1,Y1 (엔터) X2,Y2 (엔터) X3,Y3 ... 형식으로 반환합니다 추후 파싱을 필요
X1, Y1, X2, Y2
검색을 진행할 범위
Threshold
이미지 검출시 검출의 임계값. Method에 따라 각기 다른 임계값을 적절히 사용해 주어야 합니다.
임계값을 너무 높게 설정해줄 경우 템플릿과 관련이 없는 이미지를 검출할 가능성이 높아지고,
임계값을 너무 낮게 설정해줄 경우 일치하는 이미지를 검출하지 못할 수 있습니다
SearchImage
검색할 이미지의 파일 이름. 경로를 지정하지 않으면 %A_WorkingDir% 에 있다고 간주합니다
Method
검출하는 Method. 비워둘시 TM_SQDIFF Method를 채택합니다
MaxVal := TemplateMatchFromImage(InputImage, SearchImage, OutputVarX, OutputVarY [, Method])
MaxVal
일치율을 반환합니다 Method에 따라 각기 다른 형태를 지닙니다
InputImage
검색할 전체 이미지 파일 이름. 해당 이미지 파일에서 SearchImage 이미지를 검출합니다
SearchImage
검색할 이미지의 파일 이름. 경로를 지정하지 않으면 %A_WorkingDir% 에 있다고 간주합니다
OutputVarX/Y
화면에서 이미지가 발견된 X, Y 좌표를 저장할 변수의 이름
Method
검출하는 Method. 비워둘시 TM_SQDIFF Method를 채택합니다
OutputVarXY := MultiTemplateMatchFromImage(InputImage, SearchImage, Threshold [, Method])
OutputVarXY
이미지가 발견된 X, Y 좌표를 X1,Y1 (엔터) X2,Y2 (엔터) X3,Y3 ... 형식으로 반환합니다 추후 파싱을 필요
InputImage
검색할 전체 이미지 파일 이름. 해당 이미지 파일에서 SearchImage 이미지를 검출합니다
SearchImage
검색할 이미지의 파일 이름. 경로를 지정하지 않으면 %A_WorkingDir% 에 있다고 간주합니다
Threshold
이미지 검출시 검출의 임계값. Method에 따라 각기 다른 임계값을 적절히 사용해 주어야 합니다.
임계값을 너무 높게 설정해줄 경우 템플릿과 관련이 없는 이미지를 검출할 가능성이 높아지고,
임계값을 너무 낮게 설정해줄 경우 일치하는 이미지를 검출하지 못할 수 있습니다
Method
검출하는 Method. 비워둘시 TM_SQDIFF Method를 채택합니다
MaxVal := TemplateMatchFromHWND(OutputVarX, OutputVarY, HWND, SearchImage [, Method, X1, Y1, X2, Y2])
MaxVal
일치율을 반환합니다 Method에 따라 각기 다른 형태를 지닙니다
OutputVarX/Y
화면에서 이미지가 발견된 X, Y 좌표를 저장할 변수의 이름
HWND
검색을 진행할 HWND값
SearchImage
검색할 이미지의 파일 이름. 경로를 지정하지 않으면 %A_WorkingDir% 에 있다고 간주합니다
Method
검출하는 Method. 비워둘시 TM_SQDIFF Method를 채택합니다
X1, Y1, X2, Y2
검색을 진행할 범위. 비워둘시 해당 HWND전체로부터 검색합니다
OutputVarXY := MultiTemplateMatchFromHWND(HWND, Threshold, SearchImage [, Method, X1, Y1, X2, Y2])
OutputVarXY
이미지가 발견된 X, Y 좌표를 X1,Y1 (엔터) X2,Y2 (엔터) X3,Y3 ... 형식으로 반환합니다 추후 파싱을 필요
HWND
검색을 진행할 HWND값
Threshold
이미지 검출시 검출의 임계값. Method에 따라 각기 다른 임계값을 적절히 사용해 주어야 합니다.
임계값을 너무 높게 설정해줄 경우 템플릿과 관련이 없는 이미지를 검출할 가능성이 높아지고,
임계값을 너무 낮게 설정해줄 경우 일치하는 이미지를 검출하지 못할 수 있습니다
SearchImage
검색할 이미지의 파일 이름. 경로를 지정하지 않으면 %A_WorkingDir% 에 있다고 간주합니다
Method
검출하는 Method. 비워둘시 TM_SQDIFF Method를 채택합니다
X1, Y1, X2, Y2
검색을 진행할 범위. 비워둘시 해당 HWND전체로부터 검색합니다
라이브러리 파일
해당 라이브러리는 사용하시는 스크립트 파일과 함께
#Include TemplateMatch.ahk 를 스크립트 상단에 선언해주시고 사용하시고자 하시는 함수를 사용하시면 됩니다
32bit(x86) 버전과 64bit(x64) 버전 중 사용하시는 윈도우 버전 혹은 오토핫키 버전에 맞춰 다운로드하시면 됩니다
사용시 대략적인 예제를 폴더에 포함해 두었으니, 해당 예제로 테스트를 해보면서 익히면 이해에 도움이 됩니다
[2020 09 17 업데이트]
1. HWND값 좌표지정기능 추가
2. 메모리 누수 보안
AutoHotkey 32Bit(x86) 버전 :
drive.google.com/file/d/1w59vqg67VVO1Z_ITW7ExGwyRcEVg0ucn/view?usp=sharing
AutoHotkey 64Bit(x64) 버전 :
drive.google.com/file/d/1WOB4g-IotubdtqJWyj9WfYdj9fbaYXuy/view?usp=sharing