[Autohotkey][13] 오토핫키의 꽃 ImageSearch - 2

Posted by 아이티프로13
2019. 4. 8. 23:47 프로그래밍/AutohotKey



안녕하세요. 쿠과자입니다.

오늘은 저번 글에 이어서 이미지서치에 대해서 좀 더 자세히 알아보고자합니다.

이번에는 약간 심화 수준이기때문에.. 이미지 서치에 대해서 깊게 알고싶으신분들은

꼭 정독해주시길 바랍니다.




색이 다른 이미지 찾기




어제의 위 예시 이미지에서

약간 색이 다른 삼각형의 경우 상황에 따라 서치가 가능하다고 서술했었습니다.

이 경우에는 오차 범위 라는 옵션을 통해 이미지서치가 상황에 따라 가능한데요.


Imagesearch,FoundX,FoundY,X1,Y1,X2,Y2,*n 찾을이미지.png


위처럼 이미지파일 앞에 *(별)을 붙이고 값을 넣어주면 됩니다.

최대 1부터 255까지 넣을수 있고, 저같은 경우 일반적으로 30~50정도 넣어주는 편입니다.


가끔식 그래픽 드라이버가 다른경우 색이 다른 경우가 있기때문에..(안티 엘리어싱 때문입니다.)

이런 경우 최대 색 범위값을 150정도까지 주기도 합니다.


참고로, 색 범위값과 서치 범위가 넓어질수록

추후에도 알려드릴테지만 서치 속도가 기하급수적으로 커지니 조심해주세요.



한번 위 이미지에다가 오차 범위를 맞춰놓고 테스트를 해봅시다.




저같은 경우 이 사진을 따서 이미지서치를 돌려보겠습니다.




F6::

imagesearch,xx,yy,0,0,A_screenwidth,A_screenheight,*150 test02.png

if(ErrorLevel = 0)

{

    Mouseclick,left,xx,yy

    msgbox,found!

}

return



색깔이 약간 달라도, 정상적으로 인식하는걸 볼 수가 있습니다.




투명화 - Transparent 기능 이용하기


다음으로, 투명화를 통해 이미지서치를 하는걸 알아보고자 합니다.


위와 같이 찾을려는 이미지는 흰 배경이나 다른 배경에서 땃는데,

정작 찾으려는 이미지는 외곽선 부분이나 찾으려는 부분은 확실히 있는데,

배경색이라던가 뭔가 방해되는 요소(?) 들이 있어서 힘든 경우가 생길겁니다.


이럴때는 위에서 설명한 오차 범위(흔히 말하는 색값)을 넣어서 어느정도 커버가 될...수도있지만

이런 경우에는 완벽한 부분을 제외한 색을 투명색으로 지정해서

아예 나머지를 다~배제하고 그 부분만 서치하도록 할 수도 있습니다.


Imagesearch,FoundX,FoundY,X1,Y1,X2,Y2,*trans(색깔) 찾을이미지.png


위의 색깔 부분에 배경색이 될 색깔만 들어가면 됩니다.

예를 들어 흰색이면 *transWhite가 될거고,

검정색이면 *transBlack이 됩니다.


그 외의 색의 경우 transFFAABB 이런식으로 색상 코드를 집어넣으면 됩니다. RGB 순서에요.


참고로 이런 경우 이미지는 무조건 PNG 또는 GIF 형식이어야 합니다.

BMP의 경우 투명색을 지원해주지 않기 때문입니다.



한번 실제로 테스트해봅시다.


방법은 마찬가지로 위와 똑같이 이미지를 땁니다.

그 다음 딴 이미지의 배경색을 한 색으로 통일해서 저장해주세요



저같은경우 위처럼 이미지를 땃습니다.

이 경우 배경색이 하얀색입니다.


F6::

imagesearch,xx,yy,0,0,A_screenwidth,A_screenheight,*transwhite test03.png

if(ErrorLevel = 0)

{

    Mouseclick,left,xx,yy

    msgbox,found!

}

return




배경색이나 기타 다른게 포함되어있지만,

정상적으로 인식되는 모습니다.


추가적인 색값도 따로 필요없습니다.



이미지서치의 속도


추가적으로, 이미지서치의 속도에 대해서 기본적으로 알려드릴려고 합니다.
이미지서치의 속도의 경우 영향을 받는게 많이 있습니다.


  • 서치할려는 화면의 크기
  • 찾을려는 이미지의 크기
  • 범위 오차(색값) 옵션
  • Trans 옵션
  • 파일 확장자


먼저, 서치할려는 범위의 크기는 당연히 클수록 시간이 오래 걸립니다.
전체화면으로 하면 무조건 얻어걸릴수있겠지만, 시간의 문제로 Spy나 나중에 알려드릴 방법으로
따로 범위를 측정해서 서치하시길 바랍니다.

다음으로, 찾을려는 이미지의 크기입니다.
이미지의 크기는 이상하게도 클수록 시간이 오래걸립니다.
이 이유가, 결국 오토핫키 내의 이미지서치는 1:1로 매칭되는 이미지를 찾는건데
한 픽셀 단위로 매칭되는 이미지를 찾기때문에, 한 픽셀이 매칭됬다고 치면 다른 픽셀도 검사하고...
결국 이미지의 크기가 커질수록 검사해야하는 픽셀 수도 많아지기때문에 오래걸립니다.

당연히 오차 범위는 커질수록 오래 걸리는데...
오차 범위는 숫자가 높을수록 시간이 기하급수적으로 오래 걸립니다.
이것도 오토핫키의 알고리즘상으로는 오차 숫자에 따라 계속 색을 바꿔가면서 서칭하는 방법이기때문에...
당연히 오래걸릴 수밖에 없겠죠?

Trans 옵션은 당연히 쓰면 오래 걸리고..

파일 확장자의 경우 BMP, PNG, GIF, JPEG 등이 있는데
결론만 말씀드리면 BMP > PNG > GIF > JPEG 순서로 이미지를 따서 사용하시길 바랍니다.

무조건 1순위는 BMP, trans 기능을 사용할려면 PNG나 GIF, 그리고 JPG(JPEG)는 사용하지 마세요.

BMP는 무압축 방식이라서 속도가 제일 빠르고,
PNG와 GIF는 무손실 압축 방식이라서 속도는 느리지만 완전한 이미지를 저장 가능합니다.
JPG는 손실 압축방식이라서 서치를 제대로 못할수도 있습니다.




어떤가요? 오늘은 나름 노력해서 포스팅을 해봤는데...

이미지 서치에 대해서 제가 아는 최대한의 대답을 해드렸습니다.


만약 추가적인 이미지서치에 대해서 더 알고싶으시다면

https://autohotkey.com/docs/commands/ImageSearch.htm 이 글을 참고해보시길 바랍니다.

그 외에도 더 깊이 이미지서치를 활용하고싶다면...

Gdip (Gdi+, GdiPlus) 라는 추가적인 라이브러리를 이용하면 가능할겁니다.

하지만 이는 저도 잘 모르는 세계이기때문에.. 추후에 가능하면 포스팅을 하고싶지만 할수 있을진 의문이네요.


어쨋든, 읽어주셔서 감사합니다!


공감 버튼을 눌러주시면

블로거에게 힘이 됩니다!