본문 바로가기
이미지맥스 그리고 루아(lua)/[응용] 보다 효율적인 사용법

[이미지맥스] 인식 화면의 영역을 지정하여 변화율 비교하기 (객체지향)

by 위치결정 2022. 3. 26.
반응형

-- 스크린 영역 클래스 생성
screen = {}
function screen:new(x0, y0, x1, y1)
    -- 인스턴스 생성, 메타테이블, __index self 참조지정
    local instance = setmetatable({}, self)
    self.__index = self

    -- 스크린좌표 파라미터 기본값 정의 (기본값:(0,0),(1280,720))
    local x0 = x0 or 0
    local y0 = y0 or 0
    local x1 = x1 or 1280
    local y1 = y1 or 720

    -- 스크린 ROI 설정
    instance.x = x0
    instance.y = y0
    instance.w = x1 - x0
    instance.h = y1 - y0

    instance.roi = {instance.x, instance.y, instance.w, instance.h}

    print('- 스크린 영역 생성')
    return instance
end

-- 스크린 버퍼 생성 및 비교
function screen:verify()
    -- 스크린 버퍼가 없으면 생성
    if self.bits == nil then
        self.bits = NewBits(self.w, self.h)
        CaptureScreen(self.bits, self.roi)
        print('- 스크린비교 버퍼 생성')
    end

    -- 스크린 버퍼 비교 결과
    self.acc, self.fx, self.fy = BitsSearch({bits = self.bits, w = self.w, h = self.h}, self.roi)
    return self.acc, self.fx, self.fy
end

-- 스크린 버퍼 초기화
function screen:kill()
    if self.bits ~= nil then
        ReleaseBits(self.bits)
        self.bits = nil
    end
    print('- 스크린비교 버퍼 초기화')
end

스크린화면의 변화율을 비교하거나 반환받을수있는 객체지향 코드입니다.

스크린화면의 영역을 여러 변수에 각기 개별로 지정하여 클래스를 생성하여 여러 스크린 영역의 변화율을 비교하거나 반환받을수있습니다.

 

가령 0, 0 ~ 100, 100 영역의 화면은 s1에 지정하여 화면을 비교하고,

100, 100 ~ 200, 200 영역의 화면은 s2에 지정하여 화면을 비교할수있습니다.

 

s1 = screen:new(0, 0, 100, 100) 함수를 호출하여 s1 변수에 0, 0, 100, 100 영역의 인스턴스 데이터를 가지는 테이블을 생성할수있습니다.

이 테이블은 메타테이블과 __index가 self로 지정되어 screen이라는 클래스를 참조하여 동작합니다.

 

s1에 스크린영역을 가지는 객체를 생성후

s1:verify() 함수를 호출하여 현재스크린을 캡쳐할 버퍼메모리를 생성하고, 저장한 다음 변화율을 비교합니다.

이때 변화율,  비교좌표x, y를 반환합니다. 이 반환값들은 별도의 변수를 지정하여 바인딩해도 좋고, 자체로 사용해도 좋습니다.

ex) s1.acc, s1.fx, s1.fy

ex) acc, fx, fy = s1:verify()

 

s1:kill() 함수를 호출하여 스크린캡쳐용 버퍼메모리를 파기할수있습니다.

이후 다시 s1:verify() 함수를 호출하여 새롭게 현재 스크린을 캡쳐하여 비교할수있습니다.

 

-- s1 스크린1 (0,0) ~ (400,400) 영역 변화 비교
if s1 == nil then
    -- s1 변수에 스크린 영역 정의
    s1 = screen:new(0, 0, 400, 400)
else
    -- 정의된 영역 스크린 비교 실행
    s1:verify()
    print(string.format('- 스크린1 비교결과 : [ acc : %.2f, fx : %d, fy : %d ]', s1.acc, s1.fx, s1.fy))
    
    -- 비교 결과
    if s1.acc >= 95 then
        print('<< 일치! >>')
    elseif s1.acc < 95 then
        print('<< 불일치! >> 버퍼를 초기화합니다.')
        s1:kill()
    end
end
print('')


-- s2 스크린2 (500,0) ~ (1000,400) 영역 변화 비교
if s2 == nil then
    -- s2 변수에 스크린 영역 정의
    s2 = screen:new(500, 0, 1000, 400)
else
    -- 정의된 영역 스크린 비교 실행 후 반환값 별도 변수 지정 가능 (유사도, 인식좌표 x, y)
    acc, fx, fy = s2:verify()
    print(string.format('- 스크린2 비교결과 : [ acc : %.2f, fx : %d, fy : %d ]', s2.acc, s2.fx, s2.fy))

    -- 비교 결과
    if s2.acc >= 95 then
        print('<< 일치! >>')
    elseif s2.acc < 95 then
        print('<< 불일치! >> 버퍼를 초기화합니다.')
        s2:kill()
    end
end
print('')

 

 

반응형

댓글