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

[이미지맥스] 지정영역을 자동으로 분할한 ROI 테이블 만들기 makeRoi()

by 위치결정 2022. 2. 19.
반응형
-- 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)

반응형

댓글