-- 시스템 클럭을 이용한 딜레이 설정 함수
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()
이제 앱이 갑자기 멈춰도 곤란하지 않습니다.
'이미지맥스 그리고 루아(lua) > [응용] 보다 효율적인 사용법' 카테고리의 다른 글
[이미지맥스] 인식 화면의 영역을 지정하여 변화율 비교하기 (객체지향) (5) | 2022.03.26 |
---|---|
[이미지맥스] 내장함수 GetImageROI()를 활용하여 인식화면의 사이즈, 모니터의 해상도를 확인하는 방법 (6) | 2022.03.18 |
[이미지맥스] 지정영역을 자동으로 분할한 ROI 테이블 만들기 makeRoi() (4) | 2022.02.19 |
[이미지맥스] 앱플레이어 hwnd 윈도우핸들 취득 방법 FindWindow(), FindWindowEx(), PostMessage(), SendMessage(), WM_MESSAGE (780) | 2021.07.10 |
[이미지맥스] 이미지 검색 실패시 드래그 혹은 휠다운 등 추가 행동 하기 (6) | 2021.04.09 |
댓글