이미지 서치로 오토핫키를 접하신 분이 꽤 되실겁니다. 본 강좌는 이전 강좌의 내용을 모두 숙지하고 있다는 점을 전제로 하고 진행됩니다. 혹여나 이전 강좌를 보지 않으셨다면 1강부터 기초를 쌓고 오시는 것을 추천드립니다. 기초도 없이 이미지 서치부터 배운다는 것은 욕심 아니겠습니까.

 

추가로, 이미지 서치는 상당히 불안정한 기술입니다. 되도록이면 사용하지 않으셨으면 좋겠습니다. 다른 대체방법을 찾을 수 있으면 그 방법을 사용해주세요. 

 


 화면에서 이미지를 찾는 ImageSearch 

 

ImageSearch는 사용자가 가지고 있는 이미지가 화면 상에 있는지 검사하고, 있다면 그 이미지가 어디 있는지까지 알려주는 명령어입니다.

 

위 그림에서 보면, 왼쪽 별 모양이 컴퓨터 화면에 그대로 있습니다. 이럴 경우 ImageSearch를 사용해준다면 이미지는 있다고 알려 줄 것이고, 해당 이미지의 좌표는 (X , Y)라고 알려줄 것입니다.

 

백문이 불여일견, 한번 해봅시다.


 매개변수 

ImageSearch, OutputVarX, OutputVarY, X1, Y1, X2, Y2, ImageFile
  • OutputVarX: 이미지를 찾았을 때의 X좌표가 담기는 출력 변수명
  • OutputVarY: 이미지를 찾았을 때의 Y좌표가 담기는 출력 변수명
  • X1: 이미지 서치를 시작하는 X좌표
  • Y1: 이미지 서치를 시작하는 Y좌표
  • X2: 이미지 서치를 끝내는 X좌표
  • Y2: 이미지 서치를 끝내는 Y좌표
  • ImageFile: 찾을 이미지의 파일명을 포함한 경로 (+ 이미지 서치의 옵션)

지난 강좌까지 잘 따라왔다면 이해가 가지 않는 부분은 없을거예요.

 

좌표를 두 쌍씩 써주는 것이 이해가 가지 않을 수 있지만, 아래 그림을 보면 이해하실 수 있습니다.

마지막 매개변수인 ImageFile 매개변수는 찾을 이미지의 경로를 입력해주시면 됩니다. 앞에 드라이브 문자(C:\, D:\등)가 붙지 않게 써주신다면 "현재 스크립트 기준"으로 경로를 입력해주면 됩니다. (상대 경로라고 합니다.)

 

즉, 현재 스크립트와 이미지 파일이 같은 경로에 있다면 이미지명만 써주시면 되고, Images라는 폴더에 들어있다면 Images\이미지명으로 써주시면 됩니다. (이 때, 이미지명은 확장자를 포함합니다.)

 

그리고, ImageFile 매개변수에는 몇 가지 옵션을 줄 수 있습니다. 여러가지 옵션이 있지만 *n 옵션이 제일 자주 사용됩니다.

  • *n: 오차의 허용 범위를 지정해줍니다. n에는 숫자가 들어가며, 0부터 255사이의 숫자가 들어갈 수 있습니다. 숫자가 높을수록 허용 범위가 넓어지며, 기본은 0입니다.

즉 이미지 파일과 화면 상의 이미지의 오차가 있을 경우에 대비하여 적절히 써주시면 됩니다.

모르겠다! 싶으시면 30정도 적어주시면 적당합니다. 옵션은 이미지 파일 경로보다 앞에 써주며, 한 칸을 띄워줍니다.

 


 이미지 따기 

화면상에 찾을 이미지를 캡처하여 저장하는 것을 "이미지를 딴다"라고 합니다. 캡처는 자유롭게 하시되, 파일 저장 형식은 손실이 일어나지 않는 png나 bmp확장자로 저장해주세요.

캡처 도구를 이용하시거나, (캡처 프로그램 흰캡처)를 이용해서 이미지를 캡처하신 후 저장하시면 됩니다. (흰캡처는.. 제가 만든 프로그램입니다. 오토핫키는 아니구요, 강좌를 잘 보시고 있다면 한번 사용해보셨으면 좋겠습니다 ^^)

 

이미지를 따는 요령을 몇 가지 알려드리겠습니다.

  • 특징이 드러나게 딸 것
  • 가능한 한 작게 딸 것

작을수록 서치 속도가 빨라지며, 특징이 드러나게 따야 이미지가 한 부분만을 찾습니다.

 


 ErrorLevel 내장 변수 

ErrorLevel이라는 내장 변수가 있습니다. 지금까지 봐왔던 내장변수와 다르게, A_ 접두어가 붙지 않습니다.

해당 내장변수는 현재 스크립트의 진행 상태가 담겨있는데, 0이면 정상적인 진행을 하고 있다는 뜻이고 1 이상이면 특정한 요인으로 인해 실패함을 나타냅니다.

 

이미지서치를 한 이후엔 ErrorLevel변수에 값이 새로이 담기게됩니다.

이미지를 정상적으로 찾으면 0, 못찾으면 1입니다.

간혹 2가 들어있는 경우가 있는데, 구문 오류 등으로 이미지 서치를 정상적으로 할 수 없는 경우에 나타납니다.

 

MsgBox, %ErrorLevel%

위 구문을 통해 현재 ErrorLevel 값을 알 수 있습니다.


 예제 

이미지는 스크립트와 같은 위치에 있다고 가정하고, 이미지의 이름은 Image.png라고 하겠습니다.

ImageSearch, vx, vy, 0, 0, 1920, 1080, *30 Image.png
MsgBox, %ErrorLevel%

이 구문이 이미지 서치 구문이 됩니다. 0,0 부터 1920, 1080까지 Image.png과 동일한 이미지가 있는지 검사할 것입니다.

 

만약 찾는다면 MsgBox에 0이 출력되며 해당 이미지의 좌표가 vx, vy에 담길 것입니다.

못 찾는다면 vx, vy는 빈 값이고 ErrorLevel은 1이겠지요.

 

그럼 아래와 같은 스크립트를 생각해 볼 수 있습니다.

F1::
ImageSearch, vx, vy, 0, 0, 1920, 1080, *30 Image.png
if (ErrorLevel = 0)
{
    MsgBox, 이미지를 찾았습니다! `n찾은 좌표: %vx%`, %vy%
}
else
{
    MsgBox, 이미지를 못찾았습니다. (ErrorLevel = %ErrorLevel%)
}
return

F2::
ExitApp

31강.zip
0.00MB

영상을 통해 확인해보겠습니다.

 

제가 딴 이미지는 아래와 같습니다.

 

제 사이트에는 제가 딴 이미지가 포함되어있고, 네이버 메인 화면에는 없습니다.

제 사이트에서 F1을 누르니 찾았다고 뜨며, 좌표가 나타납니다.

반면, 네이버에서 F1을 누르니 ErrorLevel 1을 보여주네요.

 


 ImageSearch와 Coordmode 

ImageSearch는 CoordMode명령어에서 TargetType 매개변수가 Pixel일 때 영향을 받는다고 말씀 드렸습니다.

마우스 관련 명령어는 Mouse일 때 영향을 받고요.

 

따라서, 마우스 동작을 이미지 서치의 출력 변수로 한다면 두 동작의 좌표 체계를 맞춰주어야 합니다. 아래는 마우스와 이미지서치의 좌표 체계를 맞춰준 모습입니다.

 

CoordMode, Mouse, Screen
CoordMode, Pixel, Screen

또는

CoordMode, Mouse, Client
CoordMode, Pixel, Client

또는

CoordMode, Mouse, Relative
CoordMode, Pixel, Relative

 

 


 요약 

ImageSearch, OutputVarX, OutputVarY, X1, Y1, X2, Y2, *n ImageFile
  • OutputVar에 출력변수 X, Y 지정. 이미지를 찾으면 각각의 출력변수에 찾은 이미지의 좌표가 담긴다.
  • X1부터 Y2까진 이미지를 찾는 범위
  • *n은 오차값
  • ImageFile은 이미지파일의 경로를 확장자를 포함해서 쓸 것, 기본적으로 상대 경로
  • CoordMode의 targetType 매개변수는 Pixel의 영향을 받는다
  • 찾는 이미지는 png나 bmp로 저장하고, 가능한 한 작게 딸 것
  • 이미지를 찾으면 ErrorLevel 값이 0이 되고, 못찾으면 1 또는 2 (1은 이미지서치를 했지만 이미지가 없는 거, 2는 이미지서치가 안된 것)
  • *n과 ImageFile은 하나의 매개변수이기 때문에 콤마를 넣지 않는다.

 


사실 너무 길고 복잡한 내용입니다. 예제만 보여드리고 끝내도 사실 이리저리 만지작거리다 보면 뭐든 되는데, 굳이 그러지 않은 이유는 처음부터 이해를 시킬려고 한 제 욕심이겠지요.

 

제가 이미지 서치를 별로 좋아하지 않았던게, 강좌에 티가 나는 것일수도 있다는 생각이 듭니다.

 

다음 강의 PixelSearch는 이미지 서치를 완벽히 아신다는 가정 하에 진행됩니다.

 


| 31. ImageSearch |