-- ROI 생성 함수 : 영역 설정(sx, sy, ex, ey), 이미지 ROI 사이즈(img_w, img_y)
function makeRoi(_sx, _sy, _ex, _ey, _img_w, _img_h)
print('==================================================')
print('>> ROI를 생성합니다.')
-- 서치할 영역의 폭(x), 높이(h) 계산
local width = _ex - _sx
local height = _ey - _sy
print('width : '..width, 'height : '..height)
-- 서치할 영역 분할 갯수 (서치 영역의 폭 / 검색 거리 간격)
local width_split = (width / _img_w) - 1
local height_split = (height / _img_h) - 1
print('width_split : '..width_split, 'height_split : '..height_split)
-- roi 테이블 생성!
local new_roi_table = {}
-- X, Y 좌표 초기값 설정
x = _sx
y = _sy
-- ROI용 좌표 생성
-- print('I', 'X', 'Y', 'W', 'H')
for i = 0, width_split, 1 do
for j = 0, height_split, 1 do
local x = x + (_img_w*i)
local y = y + (_img_h*j)
local w = _img_w
local h = _img_h
-- print(i, x, y, w, h)
table.insert(new_roi_table, {x, y, w, h})
end
end
-- > 저장된 값을 확인해보기 위한 코드
-- for key, value in pairs(new_roi_table) do
-- print(string.format('#roi no: %d', key))
-- print(string.format('x: %d, y: %d, w: %d, h: %d)', value[1], value[2], value[3], value[4]))
-- end
print('>> ROI를 생성 완료하였습니다.')
print('==================================================')
return new_roi_table
end
특정영역을 분할하여 이미지를 서치하기 위해 일일이 roi값을 타이핑 하고 계셨나요?
이제 그럴 이유도 필요도 없습니다. 이 코드는 당신의 시간낭비를 없애드립니다.
함수를 실행하기위해 파라미터에 영역의 시작좌표(_sx, _sy), 종료좌표(_ex, _ey), 그리고 분할할 사이즈(_img_w, _img_y)만 알려주세요!
그러면 그 영역을 원하는 사이즈로 잘라 roi를 테이블 형태로 반환할것입니다.
rois = { {x1, y1, w1, h1}, {x2, y2, w2, h2} ... {xn, yn, wn, hn} } 형태로 말이죠
rois = makeRoi(100, 100, 200, 200, 10, 10)
-- > rois 변수에 분할된 roi값(x, y, w, h)이 테이블 형태로 저장
-- > 저장된 값을 확인해보기 위한 코드
for key, value in pairs(rois) do
print(string.format('#roi no: %d', key))
print(string.format('x: %d, y: %d, w: %d, h: %d)', value[1], value[2], value[3], value[4]))
end
그러면 이렇게 만든 roi 테이블을 활용할 차례이네요.
roi값이 저장된 테이블을 활용하여 원하는 이미지를 서치하여 카운트를 하는 함수를 예로 들어봅니다.
-- ROI를 변경하며 이미지 카운트 함수
function countImage(_string_img, _table_roi)
local counter = 0
if type(_table_roi) == 'table' then
for i = 1, #_table_roi, 1 do
SetImageROI(_string_img, _table_roi[i])
if ImageSearch(_string_img) == 1 then
counter = counter + 1
end
end
return counter
else
print('countImage() ERROR:: _table_roi must type table')
end
end
local rois = {{0, 0, 50, 50}, {50, 0, 50, 50}, {0, 50, 50, 50}, {50, 50, 50, 50}}
count = countImage('find_image', rois)
if count > 2 then
print('이미지를 3개 이상 발견하였습니다')
elseif count <= 2 and count > 0 then
print('이미지가 2개 이하입니다.')
else
print('이미지가 한개도 없습니다.')
end
rois에 배열되어있는 rois[1], rois[2], rois[3], rois[4] 테이블에 저장되어있는 ROI값을 이용하여 이미지를 찾고 카운트 하는 함수입니다.
그럼 이제 이 함수에 makeRoi() 를 통해 반환받은 roi 테이블들을 이용하면 되겠습니다.
장황하게 설명보단 아래 샘플코드를 참조해보시기 바랍니다.
< 특정 영역에서 빨간 점을 찾아 카운트 하는 샘플 코드 >
-- 샘플 :: "dot" 이미지를 검색하여 인식수량을 count 변수에 저장
rois = makeRoi(100, 100, 210, 210, 5, 5)
count = countImage('dot', rois)
print('이미지 카운트 수량 : '..count)
비록 roi에 어중간하게 걸친 이미지는 완벽하게 카운트 하지 못할때도 있지만 만족스럽습니다.
※ 단! 최근 이미지맥스 업데이트된 함수중 이미지서치 결과를 테이블로 반환받는 함수가 있네요.
이를 이용하면 위 기능보다 더 간결하게 처리 될것 같습니다. :)
-- 이미지서치의 결과를 테이블 형식으로 가져옵니다. (찾은 위치를 모두 저장)
result_count, result_table = ImageSearchMultipleResults(string imagename, SORT_PTDIST, int[] ptCenter)
'이미지맥스 그리고 루아(lua) > [응용] 보다 효율적인 사용법' 카테고리의 다른 글
[이미지맥스] 인식 화면의 영역을 지정하여 변화율 비교하기 (객체지향) (5) | 2022.03.26 |
---|---|
[이미지맥스] 내장함수 GetImageROI()를 활용하여 인식화면의 사이즈, 모니터의 해상도를 확인하는 방법 (6) | 2022.03.18 |
[이미지맥스] 인식 화면의 정지 여부 (앱동작정지) 를 검출하는 방법 (1987) | 2021.07.10 |
[이미지맥스] 앱플레이어 hwnd 윈도우핸들 취득 방법 FindWindow(), FindWindowEx(), PostMessage(), SendMessage(), WM_MESSAGE (780) | 2021.07.10 |
[이미지맥스] 이미지 검색 실패시 드래그 혹은 휠다운 등 추가 행동 하기 (6) | 2021.04.09 |
댓글