don't stop believing

투명 이미지와 findBest() 본문

Testing Automation/SikuliX

투명 이미지와 findBest()

Tongchun 2018. 1. 25. 13:40

게임을 SikuliX로 자동화 하려고 할때 동그란 버튼을 선택해야 할때가 있습니다.

이미지를 선택하면 네모 형태의 이미지가 캡처되고 그 안에 동그란 버튼이 오게 됩니다. 이때 배경에 따라 동그란 버튼 이외의 부분이 이미지로 잡히게 되는데요.  이에대한 적절한 대안으로 findBest()함수를 사용하게 됩니다.


화면의 오른쪽 밑에 칼이 그려진 동그란 보라색 버튼을 클릭하고 싶습니다.

하지만 화면이 이동하면 배경 이미지때문에 잘 매칭이 될지 의문입니다. 그래서 먼저 투명이미지를 사용해 보기로 합니다.

동그란 버튼을 캡처한 후 버튼 외의 부분을 투명하게 변경합니다. 저는 Paint.NET 프로그램을 사용해 지워봤습니다.

그런다음 find()함수를 사용해 이미지를 찾아 봅니다.

저 정도는 잘 찾아지는 것 같습니다. 하지만 Sikuli에서는 투명한 이미지는 검정색으로 인식하게 됩니다. 따라서 이미지의 Similarity를 높이면 이미지 매칭이 되지 않습니다.

Similarity가 90 이상일 경우에는 이미지를 찾지 못합니다.


그보다 다른 방법으로 findBest()함수를 사용해 보겠습니다.

findBest()함수는 여러가지 이미지 가장 유사한 이미지를 찾게 하는 것입니다. 위와 같은 경우 버튼의 동그란 모양 이외의 이미지 여러 종류로 준비하고 그 중에서 가장 유사한 이미지를 선택해 찾게 하는 것입니다.


먼저 배경이 다른 곳에서 여러장의 버튼 이미지를 캡처합니다.

                   


위 이미지를 배열로 만들고 변수에 등록합니다.

그리고 findBest()함수를 사용해 찾아보겠습니다.


하나씩 설명해 보겠습니다.

buttons라는 변수를 선언하고 이미지를 배열로 할당합니다.

attack이라는 변수를 선언하고 findBest()함수 안에 배열로 선언된 buttons변수를 파라메타로 넣습니다. 그러면 화면에서 배열로 나열된 이미지 중 가장 적합한 이미지를 하나 골라 attack변수에 넣게 됩니다.

attack 변수에 .highlight(1) 속성을 주고 이미지를 1초동안 외곽선을 붉은색으로 표시해 봅니다.


findBest()라는 함수로 값을 받은 attack 변수는 Match 클래스 속성을 가지고 있게 됩니다.

http://sikulix-2014.readthedocs.io/en/latest/match.html#Match

Match 클래스 속성인 .getIndex(), .getScore(), .toStringShort(), .getTarget() 속성을 사용할 수 있습니다.


print attack.getIndex(), attack.getScore(), attack.toStringShort() 결과는 아래와 같습니다.

5 0.985697984695 M[788,548 100x99]@S(0)

getIndex()는 buttons 변수의 값으로 있는 이미지들 중 어느것을 가지고 왔는지 확인합니다. 결과는 5이며 첫 이미지의 Index는 0입니다. 따라서 6번째 이미지와 가장 부합하여 해당 이미지를 할당했다는 의미입니다.

getScore()는 어느정도 유사한지를 보여줍니다. 1이 100% 동일하다는 의미이여 0.985697984695는 거의 99% 일치했다는 의미입니다.

toStringShort()은 해당 이미지 정보를 문자로 표시하는 것입니다. M[788,548 100x99]@S(0)은 전체 화면에서 이미지와 매칭하는 좌표는 x좌표 788, y좌표 548에 위치해 있다는 뜻입니다. 이미지 크기는 100x99네요.

getTarget()은 매칭하는 이미지의 좌표만을 가져오게 됩니다. toStringShort()에서 표현한 좌표값입니다. 


hover()함수와 getTarget()속성을 통해 마우스를 버튼 가중데로 이동시킬수 있습니다.


findBest()함수를 응용해 사용하면 다양한 경우화면 변화에 대응할 수 있습니다.


Comments