반응형
-- 스크린 영역 클래스 생성
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('')
반응형
'이미지맥스 그리고 루아(lua) > [응용] 보다 효율적인 사용법' 카테고리의 다른 글
[이미지맥스] 숫자에 콤마나 소수점, 슬래쉬가 있을때 OCR 정확도를 높히는 방법 (6) | 2022.04.27 |
---|---|
[이미지맥스] 내장함수 GetImageROI()를 활용하여 인식화면의 사이즈, 모니터의 해상도를 확인하는 방법 (6) | 2022.03.18 |
[이미지맥스] 지정영역을 자동으로 분할한 ROI 테이블 만들기 makeRoi() (4) | 2022.02.19 |
[이미지맥스] 인식 화면의 정지 여부 (앱동작정지) 를 검출하는 방법 (1987) | 2021.07.10 |
[이미지맥스] 앱플레이어 hwnd 윈도우핸들 취득 방법 FindWindow(), FindWindowEx(), PostMessage(), SendMessage(), WM_MESSAGE (780) | 2021.07.10 |
댓글