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

[이미지맥스] 내장함수 이미지서치 관심영역변경 SetImageROI()

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

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

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

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

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

 

자동화툴을 만들다보면 특정 화면 내에서 동일한 이미지로 여러 영역을 나눠서 검색해야 하는 경우가 있습니다.

이런 경우 위치마다 이미지를 모두 따는 것이 아니라 ROI (이미지서치 관심영역) 을 변경하며 동일한 이미지를 재활용 하는 방법을 사용할수 있습니다.

 

이미지맥스 내장함수 SetImageROI() 를 활용하는 방법입니다.

ret = SetImageROI('IMAGE_NAME', {x, y, width, height})
-- > 완료시 return : 1

SetImageROI() 함수는 이미지 검색영역을 변경할 이미지파일의 이름과 수정할 영역의 기준점 X, Y좌표 폭과 높이를 지정하여 사용합니다.

조심하여야 할 점은 roi는 대괄호{} 로 묶어 table형태로 지정하여야 합니다.

-- 찾으려는 이미지의 ROI를 X,Y좌표(50, 100) 을 기준으로 폭,높이 50,50 만큼의 영역에서 찾도록 변경
SetImageROI('find_image', {50, 100, 50, 50})

-- roi 변수 테이블을 별도로 지정하는 방법
roi = {50, 100, 50, 50}
SetImageROI('find_image', roi)

 

2*2 형태의 격자형태로 검색 영역을 나누어 이미지를 검색한다고 가정하여

이미지를 발견한 카운트를 하려면 다음과 같이 roi를 각기 지정하여 설정후 이미지를 검색할 수 있습니다.

roi1 = {0, 0, 50, 50}
roi2 = {50, 0, 50, 50}
roi3 = {0, 50, 50, 50}
roi4 = {50, 50, 50, 50}
count = 0


SetImageROI('find_image', roi1)
if ImageSearch('find_image') == 1 then
    count = count + 1
end

SetImageROI('find_image', roi2)
if ImageSearch('find_image') == 1 then
    count = count + 1
end

SetImageROI('find_image', roi3)
if ImageSearch('find_image') == 1 then
    count = count + 1
end

SetImageROI('find_image', roi4)
if ImageSearch('find_image') == 1 then
    count = count + 1
end

if (count >= 1) then
    print('이미지를 '..count..'번 발견하였습니다.')
else
    print('이미지를 발견하지 못하였습니다.')
end

 

이를 for 반복문 형태로 만들어 간략화 하면 아래와 같이 만들수 있습니다.

rois = {{0, 0, 50, 50}, {50, 0, 50, 50}, {0, 50, 50, 50}, {50, 50, 50, 50}}
count = 0
for i = 1, #rois, 1 do
    SetImageROI('find_image', rois[i])
    if ImageSearch('find_image') == 1 then
        count = count + 1
    end
end

if (count >= 1) then
    print('이미지를 '..count..'번 발견하였습니다.')
else
    print('이미지를 발견하지 못하였습니다.')
end

 

이를 펑션화 해서 나중에도 활용할수 있겠습니다.

countImage() 라는 펑션을 만들어 찾을 이미지와 영역을 인수로 두고 카운트를 리턴값으로 받겠습니다.

function countImage(imageName, roiTable)
    local count = 0
    if type(roiTable) == 'table' then
        for i = 1, #roiTable, 1 do
            SetImageROI(imageName, roiTable[i])
            if ImageSearch(imageName) == 1 then
                count = count + 1
            end
        end
        return count
    end
end

local rois = {{0, 0, 50, 50}, {50, 0, 50, 50}, {0, 50, 50, 50}, {50, 50, 50, 50}}
count = countImage('find_image', rois)
if count > 2 then
    print('이미지를 3개 이상 발견하였습니다')
elseif count <= 2 and count > 0 then
    print('이미지가 2개 이하입니다.')
else
    print('이미지가 한개도 없습니다.')
end

 

참 오묘합니다.

반응형

댓글