본문 바로가기
이미지맥스 그리고 루아(lua)/[기본] 스크립트 내장함수

[이미지맥스] 내장함수 이미지찾기 ImageSearch()

by 위치결정 2021. 3. 4.
반응형

이미지맥스는 루아 스크립트 언어를 사용하여 코딩이 가능합니다.

기본적으로 제공하는 기능을 활용하여도 괜찮지만, 코드를 통해 좀더 복잡하고 다양한 기능을 구현할수 있다는 것이 장점입니다.

루아의 기본적인 함수는 물론, 이미지맥스 에서 제공하는 내장함수 라이브러리도 있으니 이를 활용하여 매크로 프로그램을 설계하면 좋을것입니다.

이미지맥스에서 제공하는 함수 라이브러리는 공식카페(cafe.naver.com/imagemax/302)에서 확인하실수 있습니다.

 

이미지맥스에서 제공하는 이미지검색 함수는 다음과 같이 사용합니다.

ImageSearch('STRING_IMAGE_NAME')
-- > Return : 인식여부(0,1), 이미지유사도, 이미지중앙기준좌표 x, y, 이미지원점기준좌표 x, y
 
 local ret, acc, ix, iy, sx, sy = ImageSearch('test')

 

미리 추가해놨던 사각형 이미지 'rec' 를 검색하기 위해 다음과 같이 코드를 작성하여 실행해보겠습니다.

ImageSearch('rec')

이미지를 발견하면 이미지맥스 로그창에 원점기준좌표x, y와 유사도 기록되는것을 알수있니다.

반대로 이미지를 발견하지 못하면 아무 로그가 남지 않습니다.

 

함수를 통해 리턴된 결과를 보기위해 다음과 같이 스크립트를 수정하고 실행해보겠습니다.

print(ImageSearch('rec'))
-- > 이미지 인식시 : 1, 100, 239, 288, 87, 136
-- > 이미지 미인식시 : 0, 0, -1, -1, -1, -1

좀전과 달리 로그창에 함수를 통해 리턴 받은 값들이 기록됩니다.

각 리턴데이터들이 콤마(,) 를 기준으로 나열되는것을 알수있습니다.

상술 했듯 순서대로 인식여부(0,1), 이미지유사도, 이미지중앙기준좌표 x, y, 이미지원점기준좌표 x, y 가 확인이 되네요.

그럼 이제 이 값들을 활용하려면 변수를 지정해서 다시 실행 해보도록 하겠습니다.

 

local ret, acc, ix, iy, sx, sy = ImageSearch('rec')
print(ret, acc, ix, iy, sx, sy)
-- > 1, 100, 239, 288, 87, 136

아까 함수를 바로 출력 처리 했을때와 로그에 남는 결과는 동일하지만, 사실은 큰차이가 있습니다.

ret 변수에는 이미지의 인식 여부,

acc에는 인식된 이미지의 일치도,

ix, iy에는 이미지의 중앙좌표,

sx, sy는 이미지의 좌상단 좌표가 남게되죠.

 

이 데이터들을 이용하여 이미지를 클릭한다던지, 이미지를 기준으로 특정 지점에서 또 다른 이미지를 찾는다던지 하는 다양한 기능을 구현할수 있게 됩니다.

 

이를 다양하게 변화해서 필요한 변수만 리턴 변수로 사용할수도 있습니다.

-- 인식 여부만 필요하다면
local ret = ImageSearch('rec')
-- > ret : 1

-- 인식여부와 중앙좌표만 필요하다면
local ret, acc, ix, iy = ImageSearch('rec')
-- > ret : 1, acc : 100, ix : 239, iy : 288

 

본격적으로 실제 활용은 if 문에 씌워 이미지를 찾았을시 동작을 꾸밀수 있습니다.

-- return 값 변수를 지정하여 사용할시
ret = ImageSearch('find_image')
if ret == 1 then
    print('이미지를 찾았습니다')
else
    print('이미지를 찾을수 없습니다.')
end

-- if문에서 바로 사용할시
if ImageSearch('find_image') == 1 then
    print('이미지를 찾았습니다')
else
    print('이미지를 찾을수 없습니다.')
end

 

그외에 실용성은 떨어지겠지만 리턴값을 테이블로 받기 위해서 함수를 테이블화 하는 방법도 있습니다.

-- 리턴값을 테이블로 받고 싶은 경우 {} 로 함수를 테이블화 하면 리턴값이 테이블
local returns = {ImageSearch('rec')}
-- > returns : {ret, acc, ix, iy, sx, sy}

-- table 변수의 타입을 출력
print(type(returns))
-- > table

-- table 변수의 테이블을 인덱스로 호출, 출력
print(returns[1], returns[2], returns[3], returns[4], returns[5], returns[6])
-- > 1, 100, 239, 288, 87, 136

-- 테이블의 key, value 순으로 출력, 단 key가 없는 경우 index로 출력
for key, value in pairs(returns) do
    print(key, value)
end
-- > 1, 1
-- > 2, 100
-- > 3, 239
-- > 4, 288
-- > 5, 87
-- > 6, 136

 

아주 재밌습니다.

반응형

댓글