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

[이미지맥스] 인식 화면의 정지 여부 (앱동작정지) 를 검출하는 방법

by 위치결정 2021. 7. 10.
반응형

 

-- 시스템 클럭을 이용한 딜레이 설정 함수
function setClock()
    return os.clock()
end

function getClock(_clock)
    if _clock ~= nil then
        return os.clock() - _clock
    else
        print('getClock() ERROR : _clock is null')
    end
end

-- print('========================================')
-- print('화면 정지 비교 프로그램 ver.220509')
-- print('========================================')

-- 앱 동작 정지 감시 유사도, 판단 시간, 검사 간격 설정
STOP_JUDGE_ACC = 98 -- 유사도(%)
STOP_JUDGE_TIME = 90 -- 판단 시간(초)
STOP_CHECK_PERIOD = 5 -- 검사 간격(초)

-- 사용하는 앱의 해상도나 사이즈에 따라 변경 필수! 가로폭, 높이(w,h)
local screen_size = {w = 1280, h = 720}
local roi = {0, 0, screen_size.w, screen_size.h}

-- 현재 화면 저장 인스턴스 생성 및 스크린캡쳐
if tmp_screen == nil then
    tmp_screen = NewBits(screen_size.w, screen_size.h)
    CaptureScreen(tmp_screen, roi)
    stop_check_period = setClock()
end

-- 앱 정지판단 검사 간격 시간 도달, 캡쳐된 인스턴스와 현재화면 비교
if getClock(stop_check_period) >= STOP_CHECK_PERIOD then
    local acc, fx, fy = BitsSearch({bits = tmp_screen, w = screen_size.w, h = screen_size.h}, roi)
    print(string.format('>> 앱 정지 체크 시작 (%d초 마다 검사)', STOP_CHECK_PERIOD))
    print(string.format('( 화면유사도(acc)가 %d 이상일 경우 동작 정지 의심 )', STOP_JUDGE_ACC))
    print(string.format('[ acc : %f, fx : %d, fy : %d ]', acc, fx, fy))

    -- 설정한 유사도(기본값:98) 이상일시 앱 정지로 판단
    if acc >= STOP_JUDGE_ACC then
        if stop_check_time == nil then
            stop_check_time = setClock()
        end

        local sec = math.floor(getClock(stop_check_time))
        print(string.format('- 앱 정지 모니터 시간 : %d / %d 초', sec, STOP_JUDGE_TIME))

        -- 앱 정지 판단 설정 시간 보다 이상 정지 확인시 동작
        if getClock(stop_check_time) >= STOP_JUDGE_TIME then
            print('- 앱 정지 체크 결과 : 동작 정지 의심!')
            print('=============================================')
            -- 푸름비님 버그 픽스 내용 추가 (22.02.06) https://cafe.naver.com/imagemax/2883
            -- 스크립트 전환 전 초기화
            ReleaseBits(tmp_screen)
            tmp_screen = nil
            stop_check_period = nil
            stop_check_time = nil
            
            OpenScript('재실행스크립트') -- 재실행용 스크립트 전환

            -- LD앱플레이어 제어 GUI 적용시 추가 (22.04.24) https://plcman.tistory.com/164
            ld_quit() -- LD앱플레이어 종료 함수
            Sleep(1000)
            ld_launchex() -- LD앱플레이어 실행 및 지정앱 실행 함수
        end

    else
        -- 앱 정상동작으로 판단, 초기화
        ReleaseBits(tmp_screen)
        tmp_screen = nil
        stop_check_period = nil
        stop_check_time = nil
        print('- 앱 정지 체크 결과 : 동작 양호!')
        print('=============================================')
    end
end

 

인식 화면을 임시버퍼 인스턴스를 생성하여 스크린캡쳐 후 일정 시간이 지난뒤 비교하여 일치여부를 확인하여 화면이 정지 하였는지 검출하는 코드입니다.

검사간격은 STOP_CHECK_PERIOD_SETTIME 변수에 지정한 시간 마다 (예시 : 5초마다 1회) 실행하며,

멈춤 판단시간 STOP_JUDGE_SV 변수에서 지정한 시간 (예시 : 90초) 이상 일치율이 99% 이상인 상태가 지속되면 앱이 멈춘것으로 판단합니다.

 

앱의 멈춤 검출시 앱의 재실행 동작을 한다던지, 별도 메신저로 알람을 울린다던지 하는 식의 응용을 하시면 좋겠습니다.

 

 

- 사용된 이미지맥스의 내장함수 -

screen = NewBits(int width, int height) : 인수에서 지정한 폭(w), 높이(h) 사이즈의 이미지가 저장될수 있는 인스턴스를 생성하여 리턴합니다.

CaptureScreen(temp, roi) : 생성된 인스턴스 영역에 roi = {int x, int y, int width, int height} 로 지정한 이미지를 저장합니다.

acc, fx, fy = BitsSearch({bits = temp, w = int width, h = int height}, roi) : 인스턴스에 저장된 이미지와 인수에서 지정한 폭(w)과 높이(h) 만큼을 현재 화면의 roi로 지정한 영역과 비교하여 유사도(acc), 시작좌표(fx, fy) 를 리턴합니다.

 

이미지맥스의 내장 함수는 아래 링크에서 다시 한번 더 확인해 주시면 좋습니다.

https://cafe.naver.com/imagemax/302

 

- 사용된 사용자정의 함수 -

setClock() / getClock() : 특정 시간의 시스템 클럭을 저장(setClock)후 저장시점으로 부터 경과한 시간을 취득(getClock)해 불러옵니다.

2021.05.12 - [이미지맥스, lua/루아 lua] - [lua] 루아에서 시간 경과 확인 함수 getClock() setClock()

 

 

이제 앱이 갑자기 멈춰도 곤란하지 않습니다.

반응형

댓글