이미지리스트서치 명령어는 세로 이미지리스트의 모든 파트이미지를 검색대상 영역에서 순차검색 하며 파트이미지중 한개라도 발견시 해당 좌표와 해당 파트이미지의 인덱스를 반환합니다.

 

이 명령어는 숫자인식이나 문자인식 같은 규격화된 동일크기의 이미지를 연속검색하는 용도로 사용시 효과적입니다.



ImageListSearch , OutputVarX, OutputVarY, OutVarIndex, X1, Y1, X2, Y2, [*option] ImageListFile

 

[결과값]
ErrorLeve = 0 : 이미지리스트 중 검색 성공한 파트이미지 있음
ErrorLeve = 1 : 이미지리스트의 모든 파트이미지 검색값 없음
ErrorLeve = 2 : 이미지리스트 소스 오류, 파일이 존재하지 않거나 HBITMAP 핸들값이 유효하지 않을시 발생
ErrorLeve = 3 : 이미지리스트 상태 오류, *ListMaxNN *SelectN1:N2 값이 잘못 입력되도 이 오류 발생

 

[변수]
OutputVarX, OutputVarY : 검색성공시 이미지 좌표
OutVarIndex : 이미지리스트에서 검색성공한 인덱스번호 (인덱스번호는 0부터 시작)
X1, Y1, X2, Y2 : 검색할 영역 (X2,Y2 값은 *WH옵션으로 사이즈값으로 대체가능)

 

[옵션]
*ListmaxNN : NN값은 이미지리스트상의 파트이미지 총개수

*UseZeroIndex : 이미지리스트의 시작인덱스를 1이 아닌 0을 사용
*WH : X2,Y2값을 가로 및 세로 사이즈 값으로 사용
*n(variantion) : 이미지서치 공차값 0~255 사이의 숫자
*Scan(RB|BR|LT|TL|RT|TR|LB|BL) : 스캔방향 설정 (기본스캔방향은 RB)

  - Scan 옵션에 대한 세부설명은 '이미지서치' 명령어 항목에서 확인하세요.
*Result(LT|LB|RT|RB|Center|Random) : 검색결과 좌표값 설정 (기본값 LT)

  - Result 옵션에 대한 세부설명은 '이미지서치' 명령어 항목에서 확인하세요.
*TransN : 투명컬러값 지정, N값은 컬러명 또는 RGB 값 (ex. *TransBlack, *TransWhite, *Trans0xFFFFAA)
*TransnotN : 투명컬러영역에 없어야할 컬러명 또는 RGB 값 (ex. *TransnotWhite, *Transnot0xFFFFFF)
*HBmp : 'ImageListFile' 입력 부분에 "HBITMAP" 핸들값을 사용 (사용된 핸들은 자동소멸)
*HBmpNotDel : *HBmp 옵션과 같은 기능이지만 사용된 핸들이 그대로 유지된다.
 - 이 옵션 사용시 추후에 핸들값 초기화 필요 (ex. DllCall("DeleteObject", Ptr,hBitmap))
*Obj : 출력변수 'OutVarIndex' 를 출력오브젝트 변수로 사용

 - Object{index, validx, validy, validw, validh, w, h}
*Valid(W|H)|(L|T|R|B) : *TransN 옵션 사용시에만 유효하며, 파트이미지의 외곽 투명영역을 최대한 배제시킴
 - (W|H) : 파트이미지의 가로 또는 세로 축에서 *Valid 옵션처리할 방향 선택 (WH 모두 사용 가능)
 - (L|T|R|B) : 유효이미지의 외곽에 투명컬러영역을 1픽셀단위로 확장할때 사용 (LTRB 모두 사용시 상하좌우 모두 1픽셀단위 확장)
 - ex) *ValidW, *ValidWH, *ValidWLR
*SelectN1:N2 : 이미지리스트중 선택된블럭만 사용할때 사용 (N1 = 시작 파트이미지 인덱스, N2 = 시작인덱스부터 사용할 파트이미지 수)
*Fix(W|H) : 검색시작좌표기준으로 검색대상영역을 이미지리스트의 각 파트이미지 크기로 고정
                 (W: 가로크기고정, H: 세로크기고정, WH: 가로세로모두고정)
*Target(File|HBmp|HBmpNotDel)xx : 이미지서치 대상을 화면이 아닌 파일이나 HBITMAP 핸들로 사용
 - 검색대상이 파일일때 < > 기호로 파일경로를 둘러싸 줄것 : *TargetFile<filePath>

*FilterGray : 대상화면(이미지)의 검색영역 및 검색소스 이미지를 회색톤 이미지로 교체 후 이미지서치를 수행합니다. (추가:151207)

*FIlterMono : 모든 이미지를 흑색과 백색으로만 구성된 모노톤 이미지로 교체 후 이미지서치를 수행합니다. (백색 교체값은 Variation 범위 내의 컬러이며 그외 값은 흑색으로 교체됩니다.) (추가:151212)

 


 

*Valid 옵션에 대한 세부설명

 

*Valid 옵션은 W|H 선두옵션과 L|T|R|B 후미옵션으로 나뉘어져 있습니다.

옵션에 사용된 각 문자는 Width Height  , Left Top Right Bottom 의 앞 글자입니다.

 

후미옵션은 방향에 맞게 선두 옵션에 종속됩니다.

선두가 W 라면 후미는 L|R 만 유효하고 선두가 H 라면 후미는 T|B 만 유효합니다.

선두를 WH 둘다 사용하면 후미도 LTRB 모두 사용가능합니다.

 

 

예를 들어 가로 세로 15x16 픽셀의 파트이미지들로 이루어진 이미지리스트가 있고 *TransWhite 옵션으로 흰색 배경을 투명처리 한 상태로 검색대상 영역에서 이미지서치 한다고 했을때...

 

*Valid 옵션이 없다면 15x16픽셀 전체를 검색대상 영역에서 찾게 됩니다. 이는 검색대상 영역에 Red 컬러의 '가' 글자가 있더라도 그 크기가 15x16 보다 작다면 '가' 파트이미지 부분은 검색 실패 처리되고 이미지리스트의 다음 파트이미지 검색으로 넘어가게 됩니다.

 

*ValidWH 옵션이 있다면 15x16픽셀중 *TransWhite 영역을 배제한 노란색으로 둘러쌓인 가로 세로 9x10 부분의 실제 글자 '가' 이미지만을 검색대상 영역에서 찾게 됩니다. 위에 *Valid 옵션이 없었을때 처럼 검색대상 영역이 15x16픽셀보다 작더라도 실제 Red 컬러의 '가' 이미지만 있다면 이미지서치 성공으로 처리되는 것입니다.

 

*ValidW 옵션 라면 15x16픽셀 중 가로영역만 유효픽셀 설정되므로 실제 검색에 사용되는 픽셀은 가로 세로 9x16 픽셀입니다.

*ValidH 옵션 이라실제 검색에 사용되는 유효픽셀은 가로 세로 15x10 픽셀이 됩니다.

 

 

*ValidWH 이후에 붙는 L|T|R|B 옵션은 유효영역을 1픽셀 단위로 각 방향으로 확장시켜줍니다.

 

 

왼쪽 노란색으로 둘러쌓인 픽셀영역은 *ValidWHLTRB 옵션일때의 유효픽셀 영역이고

오른쪽 파란색으로 둘러쌓인 픽셀영역은 *ValidWHR 옵션일때의 유효픽셀 영역입니다.

 

*Valid 옵션에서 L|T|R|B 후미옵션은 거의 쓸 일이 없지만 글자간 공백까지 이미지서치기준에 넣을때 유용한 옵션입니다.

 


 

 

*Obj 옵션에 대한 세부 설명

 

 

*Obj 옵션은 OutVarIndex 변수를 오브젝트출력 변수로 사용 할 수 있도록 하는 옵션입니다.

 

반환되는 validx validy validw validh 값은 *Valid 옵션 유무에 관계없이 *ValidWH 옵션을 적용했을때의 픽셀영역을 기준으로 합니다.

 

OutVarIndex.index  : 검색에 성공한 파트이미지 인덱스 번호 (1부터 시작)

OutVarIndex.validx : 검색된 이미지의 x축 좌표값에서 유효픽셀 시작점만큼 이동한 값으로

위의 '가' 이미지를 0,0 좌표에서 찾았다고 했을시 validx 값은 3이 됩니다.

OutVarIndex.validy : 검색된 이미지의 y축 좌표값에서 유효픽셀 시작점만큼 이동한 값

OutVarIndex.validw : 가로방향 유효픽셀 수 (노란색 영역의 가로픽셀 개수)

OutVarIndex.validh : 세로방향 유효픽셀 수 (노란색 영역의 세로픽셀 개수)

OutVarIndex.w : 파트이미지 가로크기

OutVarIndex.h : 파트이미지 세로크기

 


 

아래 파일은 이미지리스트서치 테스트용 스크립트입니다.

Test.ahk 파일을 다운로드한  'Ahk+ 전용 AutoHotkey.exe 파일'   위에 드래그해서 실행하세요.

이미지리스트서치_테스트.zip

 

 

이 테스트 스크립트 구성은 아래와 같은 텍스트를 추출할 대상 이미지 파일과 해당한글폰트가 저장된 이미지리스트 파일로 구성되 있습니다.

ps. 텍스트추출용 이미지 파일은 '던파 경매장 아이템 및 가격 읽기 테스트' 스크립트로 생성했습니다.

 

 

 

<스크립트>

 

#SingleInstance Force
^\::ExitApp


/*

이 스크립트는 이미지리스트서치용 테스트 스크립트이며 글자이미지에서 텍스트를 추출합니다.
이미지리스트서치 명령어는 사용방법이 복잡하므로 실제 자신의 스크립트에 적용하기 전에 충분한 테스트가 필요합니다.

 

<구성>
1. imagelist_한글폰트.bmp : 동일크기의 10x10크기의 11223개 파트이미지로 이루어진 폰트이미지리스트
2. SearchTable.bmp : 텍스트 추출할 글자 이미지가 있는 이미지파일

*/


F1::
  imageListFile = imagelist_한글폰트.bmp   ;한글이미지들이 저장된 이미지리스트 파일
  searchFile = SearchTable.bmp              ;검색대상 이미지 파일
  colorFont := 0xFFFFFF                          ;글자색 : 힌색
  spacePixelCnt := 5                               ;띄어쓰기 픽셀 개수
  
  ;이미지크기 얻기
  ImageGet,,,,,, searchFile,, imgSize
  
  ;검색대상이 화면이 아닌 이미지파일이므로 TargetFile 옵션 사용
  ;글자이미지가 시작되는 y축 좌표 얻기
  PixelSearch, sx,starty, 0,0,0,0, colorFont,, *TargetFile<%searchFile%>
  ;글자이미지가 시작되는 x축 좌표 얻기
  PixelSearch, startx,sy, 0,0,0,0, colorFont,, *TargetFile<%searchFile%> *ScanBR
  
  ;글자시작점 못찾을시 종료
  if (startx="" or starty="")
  {
    MsgBox, 글자시작점 찾기 실패
    return
  }
  
  ;이미지에서 글자 추출 시작
  curx := startx  ,  cury := starty  ,  endx := imgSize.width-1  ,  endy := starty + 10
  text =
  loop
  {
    ImageListSearch, sx,sy,so, curx,cury,endx,endy, *TargetFile<%searchFile%> *Listmax11223 *UseZeroIndex *ValidWH *FixW *Obj *TransBlack *Transnot%colorFont% %imageListFile%
    
    ;*TargetFile<%searchFile%> : 검색대상이 화면이 아닌 이미지파일인 경우 사용하는 옵션
    ;*Listmax11223 : *ListmaxNN옵션으로 NN은 이미지리스트의 파트이미지 총 개수를 나타낸다.

    ;*UseZeroIndex : 이미지리스트의 시작인덱스를 1이 아닌 0을 사용한다.
    ;*ValidWH : 이미지리스트의 각 파트이미지의 크기를 재조정한다. (투명값으로 처리된 외곽 픽셀영역을 최대한 제거)
    ;*FixW : 검색대상영역의 시작좌표를 기준으로 검색할 가로영역을 파트이미지크기에 맞게 고정한다. (*Valid 옵션의 영향도 받는다)
    ;*Obj : so 변수는 원래 검색성공한 파트이미지의 인덱스 번호를 반환하지만, 이 옵션으로 인해 세부항목이 포함된 오브젝트 변수를 반환한다.
    ;*TransBlack : 이미지리스트의 검은색영역을 투명색 처리
    ;*Transnot%colorFont% : 이미지리스트의 각 파트이미지를 검색영역에서 검색시, colorFont 컬러값이 투명처리된 픽셀에 존재할시 노매치 처리한다.
    ;(비슷한 글자 오인 추출을 막음 : ex. '각' 과 '감')
    
    if !ErrorLevel
    {
      ;*Obj 옵션으로 인해 so 출력변수는 인덱스값 뿐만 아니라 찾은파트이미지의 세부정보를 저장한 오브젝트를 반환함
      text .= GetChar_Hangle(so.index)  ;추출한 글자 저장
      curx := so.validx + so.validw       ;x축 검색시작점을 찾은글자의 다음픽셀로 교체
      
      ;현재검색점에서 다음글자가 나타나는 지점을 찾기위해 픽셀서치
      ;*ScanBR 옵션은 '상측에서 하단' 그리고 '좌측에서 우측' 으로 검색하므로 처음 나타나는 x축 글자픽셀 위치를 정확히 찾을수 있음
      PixelSearch, nextx,sy, curx,cury,endx,endy, colorFont,, *TargetFile<%searchFile%> *ScanBR
      if !ErrorLevel
      {
        spaceCnt := (nextx-curx) // spacePixelCnt   ;띄어쓰기 개수 얻기
        curx := nextx   ;x축 검색시작점을 발견된 다음글자 시작점으로 교체
        
        ;띄어쓰기 적용
        loop % spaceCnt
          text .= " "
      }
      else
        break   ;발견된 글자가 없을시 루프 종료
    }
  }
 
  msg =
  (LTrim
    글자시작점 = %startx%,%starty%
    추출한글자 = %text%
  )
  MsgBox % msg
return

 

;------------------------------------------------------------
;이미지 배열인덱스로 한글 한글자를 반환한다.
;반환값 실패시 "" 빈문자열 반환
GetChar_Hangle(index)
{
  ;한글이미지리스트의 파트이미지 수 = 11223 (완성한글글자수 11172자 + 개소한글글자수 51자)
  static asc_가 = 44032     ;부터 11172개 글자
  static asc_힣 = 55203
  static asc_ㄱ = 12593     ;부터 51개 글자
  static asc_ㅣ = 12643
 
  asc := asc_가 + index
  if (index>=11172)
    asc := index - 11172 + asc_ㄱ
  return Chr(asc)
}

 

 

 



< ImageListSearch 추가 예문 링크 >

 

 -> ImageListSearch 예문1 - 이미지에서 연속된 숫자 추출

 

Posted by 와이로