오토핫키 커뮤니티

조회 수 4123 추천 0 댓글 28

게임에 보면 ,?아이템 얼마 , 합계얼마 , 능력치 얼마 ,, 이런식의 숫자가 있습니다.

이걸 가져와서 써먹어야 할때가 있죠.

?

이 부분을 해보신분이 계시나요?

어떤식으로 처리 하셨는지 궁금합니다.

?

?

제가 클래시오브클랜에서 자원 검색시 , 자원이 얼마인지 알아내서 그자원이상일경우 멈추는걸 해봣는데요.

해보면 너무 복잡하게 나열이 되네요. 제 생각이 짧아서 응용이 안되는군요.

?

클래시오브클랜 서칭시 아래처럼 숫자가 나옵니다.


https://i.imgur.com/MushmnG.png



저 숫자들의 문제점은 한자리에 고정되지 않습니다. 상하는 1픽셀차이로 왓다갔다하니 상관없는데

좌우가 차이가 많이 납니다.

그림보시면 , 숫자 1이 폭이 좁고 , 0과 4가 폭이 꽤큽니다. 나머지숫자는 비슷하죠.

또한 중간에 공백이 폭이좁게 있습니다. 이 공백역시 첫자리 다음에 있을수도 , 2번째자리 다음에 있을수도 잇고 그럽니다.



이걸 이미지 서칭으로 해보려고 고심한끝에 , 아래같은 방법밖에 안떠오르더군요.

?

https://i.imgur.com/4vvUHvA.jpg


각 자릿수를 범위로 잡는데, 잴 먼저 첫자리수부터 잡습니다.

여기서 첫자리가 1이면 다음자리부터 범위가 앞으로 당겨지게 됩니다.

4라면 더 뒤로밀리겠죠.

그래서 첫자리가 1인지 4인지 구분부터 합니다.?

범위를 먼저 숫자 1의 폭만큼 이미지서칭해서 1이면 다음 자리는 숫자1 바로 다음 좌표부터 우측으로 시작됩니다.

그런데, 1다음에 공백이 잇을수도 있기 때문에 공백을 찾아야합니다.

공백(스페이스)은 이미지서칭이 불가능하기 때문에 , 그림 숫자 8에 표시된것처럼 1번범위서칭해서 1인지 판단,

1이면 1이고 , 1이 아니면 2번범위까지 확대해서 1이나오나 판단하여 1이 나온다면 공백있고 뒷자리가 1이라는 거죠.

이 부분 좀 생각해보시면 이해되실거에요.


저런식으로 각자릿수에 1인지 , 아닌지 공백인지 , 0인지 4인지 각자릿수마다 다 경우를 따지면서

1,0,4 아닐경우 숫자 숫자 0~9까지 서칭해서 맞는게 그자리 숫자라고 찾게 됩니다.



일단 대충 2번짜리 찾는거 부분적으로 보면요.


;2번째 자리가 1인지??

if(ImgcheckPS(54,61,60,76,"no1"))

{

2nb:=1 ?; 2번째자리 1

if(ImgcheckPS(59,61,66,76,"no1"))

{

;2번째자리 1,바로다음 1인지 1이면 3번째1

3nb:=1

return

}else{ ?; 2번째자리 1아닐경우 x좌표범위 확장

if(ImgcheckPS(59,61,70,76,"no1")) ? ;확장자리에 1이면

{

3nb=space ?; 3번째는 공백

return

}else{ ?;확장자리 1아니면

loop,parse,nums,| ? ; 0~9까지 루프서칭

{

LF := "no"A_LoopField

if(ImgcheckPS(59,61,70,76,LF)) ?;숫자찾으면

{

3nb:=A_LoopField ?;3번째자리는 루프숫자

return

}

if(a_loopfield=0){

3nb=space

return

}

}

}

}

}else{ ? ;두번째자리 1아니면,,,,,아래..

if(ImgcheckPS(53,61,65,76,"no1"))

{

생략................



대충 저런 구조가 되어버리는데요.

if조건문으로 저렇게 계속 범위 쪼개가면서 처리할수밖에 없을까요?


지금 저기 자릿수는 3자릿수 범위까지하는데 이게 커질수록 점점 처리속도는 심하게 느려집니다.

그래서 편법으로 공백이 나오면 바로 넘어가게 하고잇네요. 1자리 검색후 2자리가 공백이면 다음거 검색으로요

어차피 10만단위 이상만 찾을거라,

위 구조로 작동은 아주 잘됩니다.. 10만이상 단위로 실수없이 잘 찾네요.


근데 ?속도도 좀 느리고 다른방법이 없을가 하고 찾아봤는데요

스캔해서 문자로 바꿔주는 OCR 어플이 있더군요.

GOCR이라는건데 ?, 오토핫키에 쓸수잇게 되어있네요. ?include로요.

근데 정확성이 매우떨어져요 특히 게임상 문자는 불가능에 가깝더라구요.?



혹시 이런 게임상 숫자를 좀 쉽게 잡아낼수 있는 방법이 있을까요.

그리구 위 제가 쓴 거 좀더 보기 좋게 깔끔하게 할수 잇는 방법은 어떻게 해야 될까요.

그나마 저거 하면서 함수 응용하다가 그럭저럭 초반 응용법은 잡혀가네요.




  • 까치발가락 2015.04.14 02:24

    문자인식은 항상 까다롭죠.

    우후훅님의 코드를?보면 이런 식으로 이용하면 되지 않을까 싶네여;;


    ; iImage:?[0~9: 숫자][10: 공백]

    iResult:= 0

    Loop

    {

    ? bExist:= false

    ? iImage:= 0

    ? Loop, 11

    ? {

    ??? sName:= no . %iImage%

    ; ImgcheckPS 검색 위치(?)를?변수로 이동.

    ??? if ImgcheckPS(59,61,66,76,%sName%)

    ??? {

    ????? bExist:= true

    ??? ? Break

    ??? }

    ? ? iImage+= 1

    ? }


    ? if !bExist

    ??? Break

    ? else

    ? {

    ??? if iImage = 11

    ????? Continue

    ??? else

    ? ??? iResult*= 10

    ? }


    ? iResult+= iImage

    }


    테스트는 안해봤습니다.

    참고만 하시길..

  • 우후훅 2015.04.14 08:44
    parse로 loop하는거보다 간결해보인는것 같습니다. ㅎㅎ
  • theruin 2015.04.14 05:45

    숫자 같은게 동시에 나올수 있으니 멀티 이미지 서치를 이용해서 찾은다음 찾은 x값순으로 sort해서 그순서로 숫자 반환 될거 같은데요?

  • theruin 2015.04.14 05:53
    아니면 첫번째 범위(한개의 숫자가 10픽셀 안넘으니 x범위를 10픽셀주시면될듯) 줘서 숫자 찾고 그 숫자 나오면 그 숫자에 해당하는 만큼 서치 시작 범위를 옆으로 이동해서 다음숫자 찾는식으로 해도 될거 같네요
  • 우후훅 2015.04.14 08:46

    그게 안되요..ㅎㅎ 그게 됏으면 좀 많이 단축됏을텐데 말이에요.
    각 숫자들이 단 1~2픽셀차이라도 그게 누적되면 뒷자리로 갈수록 큰 오차가 나게되죠.

    각 숫자의 끄트머리가 겹치기도 하네요. 공백의 크기가 워낙 협소해서 그것도 걸림돌이구요
    정말 많이 스샷 찍고 포토샵으로 픽셀 오차 비교하면서 했네요. 최적의 숫자크기 따는데 시간 엄청걸렷네요.

  • theruin 2015.04.14 12:18

    제말은 정확한 픽셀은 필요 없습니다. 적당한 범위(2개의 숫자만 안들어가면되는 정도의 크기)를 첫숫자 찾고 그글자 픽셀크기만큼 옆으로 움직입니다 그크기 숫자가 일정하지 않다니 1-2 픽셀 빼주시는게 좋겠죠. 그만큼 옆으로 이동해서 다시 범위 주면 될듯한데요. 거기다가 뒤로가서 오차가 커져서 범위 앞숫자를 찾기전에 그다음 숫자를 찾아 버려도 시작위치 비교해서 거기서 멀다면 그건 패스해버리면 되니 괜찮을거 같은데요. 뭐 이거보단 멀티이미지서치 이용하는게 편할수도 있겠네요

  • 우후훅 2015.04.14 13:48

    무슨말씀인지 대충 알겠습니다. 이게 해보면 애매한게 , 2,3,7등은 폭이상당히 좁아서 4,0범위로 잡는다면
    저런수와??1이 합쳐지면?포함되버리고?오차가 심해지네요.?

    이미지를자를때 그걸 염두에 두고 넓게자르거나 좁게자르가나 해도 잘안맞네요.

    ?정확히 한개의 범위로 옴겨가면서 하는게 저런 오차땜에 잘 안되더라구요.
    멀티이미지 서치는 무슨 말인지 모르겠습니다.

  • theruin 2015.04.14 14:55

    숫자 나오는 범위를 다 잡고, 그리고 이미지서치 시작지점 변수 하나 잡아서 이미지 서치 돌렸을때 시작점이랑 비교해서 첫 숫자 찾고 다음 이미지 서치 시작 지점을 첫숫자의 이미지 서치 결과에서 2픽셀정도면 옆으로 이동해 버리면 첫숫자는 당연히 못찾으니 패스되고 거기서 찾은 숫자마다 시작점과 비교해서 가까운쪽이 다음 숫자가 되겠죠. 다시 다음 서치 시작점을 이번에 찾은 점에서 옆으로 2픽셀 넘기는 식으로 하시면 될듯한데요 시작 범위만 조금씩 전에 찾은 숫자에서 옆으로 조금 이동해서 시작점이랑 비교해서 가까운숫자 찾는 식으로요.

    멀티 이미지 서치는 중복이미지 찾아주는거거든요. 숫자가 동일한게 여러개 나올수 있으니까요. 아무튼 멀티이미지서치로 0-9까지 전부 다 찾아서 x 값비교해서 제일 작은 값이 앞에오니 그순서로 배치하라는거였습니다.

  • 우후훅 2015.04.14 15:07

    멀티이미지서치를 직접 만들어진 소스가 있는건가요
    근데 말씀하신거 보면
    숫자나오는 전체 총 범위 x,y,w,h 지정후에 0~9까지 숫자를 다 서칭해서 나오는 숫자들의
    각 vx좌표로 어떤숫자가 앞서는지 알수가 있겠군요. 근데 문제는 중복숫자군요.
    중복숫자의 경우 왼쪽에 먼저나온 숫자만 찾을테니까요. 이후 나오는 중복숫자도 찾아서 vx값을
    알아야 할텐데 , 이 부분을 말씀하시는건지 ,,
    이 방법이 확실히 간결해보이는 느낌인데 생각지도 못했습니다.

    전체 자릿수 숫자 다찾아도 속도도 빠를거같고 자릿수 다찾으면 공백은고려할필요도 없으니까요.. 후덜...

    중복숫자 부분 처리가 관건이네요

  • theruin 2015.04.14 15:35
    http://v1.autohotkey.co.kr/cgi/board.php?bo_table=script&wr_id=466&sfl=&stx=&sst=wr_hit&sod=desc&sop=and&page=1

    Multiple Imagesearch 함수랑 예제 입니다. 참고하세요
  • 우후훅 2015.04.14 16:07
    감사합니다.. 그냥저냥 덮고 잇엇는데 루인님 얘기듣다보니 이런방법도 잇구나 생각하게되네요. 틈나는 데로 해봐야겟습니다 새롭게 다시 만들어봐야겟어요
  • 우후훅 2015.04.15 20:07
    바람 좀 쐬고 왓더니 무슨말씀인지 이해가 됏습니다.. =ㅁ=;;
    아까는 약간 차이가 잇게 알아들엇엇네요.. 제가하덬 방법과는 비슷하면서도 아주 차이가 크네요 확실히 줄어드는거네요. 날이갈수록 이해력이 떨어져서 큰일입니다. (^^)(__)
  • 융기사이오목 2015.04.14 13:24

    이런건 어떨까요? 각 숫자마다 제일 윗줄에있는 픽셀패턴이 다른것 같은데 그걸 인식하는 방법으로요 아니면 픽셀 갯수라든지....


    정확한 숫자 모양을 인식하려하면 너무 오래걸리니까 픽셀을 인식하는방법이 좋을것 같아요~

  • 우후훅 2015.04.14 13:59
    픽셀은 해보질 않앗네요. 저 게임이 안티엘리어싱이 있어서 이미지외곽부분이 약간 반투명하면 배경색과 섞여서
    색값이 변합니다. 안쪽은 변하지 않을거 같기는하네요. 픽셀서치를 써본적이 없어 생각을 안해봣네요
  • USW 2015.04.14 18:20

    [제 생각이지만]

    숫자와 숫자 사이에 있는 공백의 이미지를 보니 초록색으로 구성되어있는데 만약에 저부분의 색이 크게 바뀌지 않는다면

    (사람이 보기에 초록색으로 인식하는 범위)라면 저 초록색을 이미지를 1(가로)X 숫자의길이(세로)만큼 따와서 공백만 체크해주면 숫자야 이미지의 크기가 작은1이 아닌 경우에는 거의 다 비슷하니깐 어떻게하면 잘 될것 같은데 말이죠 ^ㅡ^;;

    그리고 숫자조합이야 뭐 10만자리부터 보신다고 했으니 10만자리를 1로 보면 100만자리에 수는 찾은이미지*10으로해서

    반환하면 되실듯 합니다....

  • 우후훅 2015.04.14 19:12
    당근 바뀌죠 ㅎㅎ. 숫자역시도 트랜스 처리를 해주어야합니다.
  • USW 2015.04.15 12:14
    트랜스를 할 경우에는 성능저하가 심할것으로 예상되는데....
    저같은 경우에는 예전 질문글에서 쓴거랑 안쓴거랑 뭐가 더 빠르냐에 대해서 물어봤는데요

    결론적으로, 10~100배정도 느리던데요....
    (찾고하자는 이미지가 총 6개인데요, 1개당 0~9까지 대입을 해야되서 총 54번 찾는데요 그것도 실시간으로
    계속 찾아야됩니다. 그래서 빠르게 좌표값을 반환하는게 중요한데 그냥 이미지서치에 대해서 성능을 비교하는것으로는 차이가 나질 않지만 그 이미지서치가 비교구문 안으로 들어가는 순간 성능저하가 심해지더라구요..
    그래서 저는 트랜스 사용은 잘 안하고 있어요...정확한 이미지를 찾는 경우를 제외하고는요...)
  • 우후훅 2015.04.15 12:57
    trans를 하지 않으면 0이나 4 7 9등 배경이 보이는 것들때문에 차이가게 되네요.
    그렇다고 너무 작게 자르자니 x좌표 폭이 중요한데 작게 자르면 글자가 두개가 포함되는경우가 발생합니다.
    이미지 자를때 더 세심하게 하면 되겟으나 그게 또 엄청난 반복인지라
    근데 하나 안하나 체감되는 차이는 많지 않을것으로 보여요. 10배라 쳐도 사람이 체감하는데는 ..
    그것보다 중요한것은 0~9까지 반복횟수를 얼마나 줄이느냐가 관건이 되네요
  • 핸콕 2015.04.15 07:44

    접근방식을 바꿔보면 어떤가요..첫자리 숫자 뒤에 숫자를 서치하려 하지말고

    골드의 경우.. 숫자 10개를 캡춰해서, 10개의 이미지를 한 루프안에서 한번에 서치..

    있는 숫자들만. 찾아낸 좌표코드로 정렬..끝..

  • 우후훅 2015.04.15 09:10
    위에 루인님이 말씀하신 부분입니다. 그럴경우동일 숫자가 둘이상 발생할때 멀티이미지 서치를 하라는 뜻이엇죠. ㅎㅎ
  • 리체 2015.04.15 09:25
    그 방식은 동일 숫자가 있을 경우, 뒤에 있는 같은숫자를 못찾죠.
  • 핸콕 2015.04.15 10:01
    그렇네요..결국..순차적 구역설정해서..멀티서칭을 해야겠네요^^ㅋ
  • 리체 2015.04.15 10:23

    백만단위가 나올수도 있지만, 극히 미비하므로, 배제한다는 가정하에

    0~9 까지 10개의 이미지 준비

    서치범위, 0의 크기보다 조금 더 큰 15정도

    첫번째 ImageSearch, vx1, vy1, ax1, ay1, ax1+15, ay2 라고 했을시

    맞는 이미지가 나온다면 해당이미지의 숫자를 imgnumber1에 할당하고

    찾은 숫자가 1이라면 찾은 x좌표에 본문 1 숫자의 크기보다 조금 작은 x값 r1=5, r2=20를 주고,

    (못찾을경우 마찬가지)

    아니라면 r1=10, r2=25 을 줍니다


    두번째?ImageSearch, vx2, vy2, vx1+r1, ay1, vx1+r2, ay2

    .

    네번째는 공백크기 +4를 더 줍니다.

    ImageSearch, vx4, vy4, vx3+r1+4, ay1, vx3+r2+4, ay2

    다섯번째?ImageSearch, vx5, vy5, vx4+r1, ay1, vx1+r2, ay2

    .

    제대로 이미지서치가 되었다면, gold=%imgnumber1% .... %imgnumber6% 가 됩니다.


    우후훅님의 방식과 비슷하지만, 소트할 필요가 없습니다.

  • 우후훅 2015.04.15 11:05

    제가 만들어둔것과 거의 같은상황이네요. 공백은 2번째, 3번째 4번째,5번째 모두에 올수 있습니다.
    또한 , 0,4가 숫자에 포함될경우 그에 따른 확장픽셀값도 별도로 추가해줘야합니다.
    첫번째가 1일경우 2번째자리 첫좌표는 조금 왼쪽으로 2번째가 1이나오면 또 역시 조금작은범위로,
    2번째가 0이나 4가 나오면 3번째 자리는 더 우측부터시작 , 아니면 2번째자리가 공백이고 3번째자리가 1이라면
    2번째자리의 폭을 기본 자리폭으로 잡을시 2번째자리 공백과 1이 같이 묶여서 2번째자리가 1이되버리죠.
    암튼 이런식으로 하면 여러번의 경우의 수가 발생하기 때문에 6자리숫자를 다 찾을시 상당한 시간이 걸립니다.

    하지만, 위의 theruin님이 말슴하신 부분에 비출경우, 좌표방식으로 제가 생각하고 있는것은
    전체 6자리 범위를 모두 정해두고 , 일단 1부터 찾습니다.
    가령 숫자가 231416 이라면, 1좌표의 vx값을 변수에 저장하고 찾은값이 1이라면 vx에 + 1의픽셀값을더하고
    vx2 := vx+(1의픽셀) , vx2부터 범위끝까지 다시 1을 찻습니다. 그럼 5번째 1이 발견되겠죠. 그값의 vx값 역시
    변수에 저장합니다. 이런식으로 1~0까지 다 서칭하면 동일숫자 포함 전체 검색해서 각 자릿수의 vx값을
    찾아내겠죠. 이후 vx값이 가장 적은 수로 정렬시키면 됩니다.
    이 정렬과정에서 소트가 필요한데 그부분은 위에 제가 또 질문을 게시한게 있습니다.

    이렇게 할 경우 확실히 검색이 간결해지게 됩니다.

  • 까치발가락 2015.04.15 23:01

    이상하네요?

    이미지서치 X좌표 찾는게 어려운가 보네요...?


    해보진 않았지만,

    배경색의 복잡도가 높지 않으니 variation을 적당히 주고,

    숫자를 0-9까지 이미지 파일로 저장한 다음,

    이미지비교 한 후 트루값이 반환되면 해당 이미지 폭을 가져와서,

    기존 X좌표에 더해주면 될꺼 같은데...

  • 까치발가락 2015.04.15 23:23
    공백이 3칸짜리와 4칸짜리 2개가 있을 것으로 보이는데,
    이것도 이미지로 넣고 찾으면 위 방법으로 해결되리라 기대합니다.
  • 우후훅 2015.04.16 08:34
    애초에 제가 질문드린의도는 제가 저런방법을 하는데 속도적인 문제와 다른 더 쉬운방벚이 없느냐는 뜻에서 질문을 드렷는데 theruin님이 이미 댓글에 같은 내용 말씀하셧어요. 하지만 이 역시 제가하는방법과 비슷한 속도를 내주고잇네요. 역시 더빠른방법은 전체범위를 한번에 찾는수밖엔 없을것같습니다
  • profile
    안호성 2015.04.24 05:32

    이 비슷하게 바람에 나라에서 쓴적이 잇습니다?


List of Articles
분류 제목 글쓴이 최근변경 추천
질문 모바게님 비활성 이미지클릭 간소화 함수 질문요 6 두더지 2015.04.17 0/0
질문 변수 질문 5 암드래 2015.07.16 0/0
자유 근데 OCR로 이미지 판단이 가능할까요? 2 우후훅 2015.04.17 0/0
질문 블택윈도우화면 위로 Gui 텍스트 글자 보이게 하기 3 제주소나이 2015.04.22 0/0
질문 기본 연산자 기호관련해서 질문드려요 15 우후훅 2015.04.17 0/0
질문 지니 비활성화 질문 10 백곰e 2015.04.16 0/0
정보 gdip 간단 응용 팁들 13 매크로맨서 2015.04.18 0/0
정보 Gdip를 이용한 클립보드에 있는 이미지를 통한 이미지서치 11 암드래 2016.07.19 0/0
정보 일정이미지 발견시 다른이미지서치 할수있나요? 2 세나블텍 2015.04.16 0/0
질문 한스크립트안에 여러가지 스크립트를 넣어 놓을수 있나요? 4 세나블텍 2015.04.22 0/0
질문 coc는 매크로 불가능한가요? 8 콘초블레이드 2015.04.16 0/0
질문 gdip_imagesearch 사용하시는 분들 중에 tolerance 건... 12 매크로맨서 2015.10.08 1/0
질문 gui 질문좀할께여 8 백곰e 2015.04.15 0/0
질문 블루스텍 구동시 화면깨짐 현상.. 1 흑염제 2015.04.15 0/0
질문 임의의 숫자가들은 변수를 소트하는방법을 좀 부탁드려요. 14 우후훅 2015.04.15 0/0
질문 지니모션 복제실행 6 나는황제다 2015.04.22 0/0
자유 여기서 개발하시는분들은 보안도 신경쓰셔야할거같아요. 15 외치기 2015.07.26 0/0
질문 화면 해상도 4 나는황제다 2015.04.23 0/0
질문 게임상나오는숫자 이미지서칭으로 찾는방법요 28 우후훅 2015.04.24 0/0
질문 블루스택 터치문제 4 불꽃앞점멸 2015.04.15 0/0
Board Pagination Prev 1 ... 172173174175176177178179180 ... 209 Next
/ 209

전체 최신 인기글

전체 주간 인기글