인식 화면의 정지 여부 (앱동작정지) 를 검출하는 방법

 

-- 시스템 클럭을 이용한 딜레이 설정 함수 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()

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

 

원문) 인식 화면의 정지 여부 (앱동작정지) 를 검출하는 방법

출처) https://cafe.naver.com/imagemax/1644