Halcon에서 여러 영역을 정렬하는 sort_region 연산자 분석

sort_region은 Halcon에서 여러 개의 영역(Region)을 특정 기준에 따라 정렬할 때 사용되는 중요한 연산자입니다.

연산자 정의 및 시그니처

이 연산자는 영역들의 상대 위치를 기준으로 정렬을 수행합니다.

sort_region(Regions : SortedRegions : SortMode, Order, RowOrCol : )
  • Regions: 정렬 대상 영역들
  • SortMode: 정렬 방식
  • Order: 'true'(오름차순) 또는 'false'(내림차순)
  • RowOrCol: 'row'(행 기준) 또는 'column'(열 기준)

주요 정렬 모드

총 7가지 정렬 모드가 있지만, 실무에서는 주로 다음 3가지를 사용합니다:

  • 'character'
  • 'first_point'
  • 'last_point'

이 중 'first_point'와 'last_point'는 서로 반대되는 정렬 방식이므로, 핵심은 'character'와 'first_point' 두 가지를 이해하는 것입니다.

정렬 모드별 동작 원리

1. 'first_point' 모드

sort_region(Regions, SortedRegions, 'first_point', 'true', 'row')

이 모드는 각 영역의 최소 행 좌표값을 기준으로 오름차순 정렬합니다.

다음 예제 코드로 확인해보겠습니다:

dev_get_window(WindowHandle)
dev_set_color('red')
set_display_font(WindowHandle, 13, 'Courier', 'true', 'false')

read_image(Image, 'sample.jpg')
threshold(Image, Region, 0, 120)
fill_up(Region, Region)
opening_circle(Region, Region, 3.5)
connection(Region, Regions)

// first_point 기준 정렬
sort_region(Regions, SortedRegions, 'first_point', 'true', 'row')

dev_display(Image)
count_obj(SortedRegions, Count)
for i := 1 to Count by 1
    select_obj(SortedRegions, TargetRegion, i)
    dev_display(TargetRegion)
    area_center(TargetRegion, Area, Row, Col)
    disp_message(WindowHandle, ' '+i, 'image', Row-8, Col-20, 'black', 'true')
endfor

2. 'character' 모드

sort_region(Regions, SortedRegions, 'character', 'true', 'row')

이 모드는 텍스트 인식과 유사한 방식으로 영역들을 줄 단위로 그룹화하여 정렬합니다.

핵심 개념:

  1. 수직 방향으로 겹치는 영역들은 같은 줄로 간주
  2. 같은 줄 내에서는 수평 위치에 따라 정렬
  3. 인접 줄 간에는 수직 겹침이 없어야 함

예제 코드:

dev_get_window(WindowHandle)
dev_set_color('blue')
set_display_font(WindowHandle, 18, 'Courier', 'true', 'false')

read_image(Image, 'layout.png')

// 테스트용 사각형 생성
gen_rectangle2(Rect1, 80, 120, 0, 40, 30)
gen_rectangle2(Rect2, 83, 350, 0, 40, 30)
gen_rectangle2(Rect3, 77, 580, 0, 40, 30)
gen_rectangle2(Rect4, 245, 300, 0, 40, 121)
gen_rectangle2(Rect5, 400, 235, 0, 40, 30)
gen_rectangle2(Rect6, 396, 450, 0, 40, 30)

concat_obj(Rect1, Rect2, Group)
concat_obj(Group, Rect3, Group)
concat_obj(Group, Rect4, Group)
concat_obj(Group, Rect5, Group)
concat_obj(Group, Rect6, Group)

// character 모드로 정렬
sort_region(Group, ResultRegions, 'character', 'true', 'row')

dev_display(Image)
count_obj(ResultRegions, Total)
for idx := 1 to Total by 1
    select_obj(ResultRegions, CurrentObj, idx)
    dev_display(CurrentObj)
    area_center(CurrentObj, _, Y, X)
    disp_message(WindowHandle, ' '+idx, 'image', Y-12, X-26, 'black', 'true')
endfor

3. 'upper_left' 및 기타 모드

'upper_left', 'upper_right', 'lower_left', 'lower_right' 모드들은 각각 영역의 외접 사각형 기준 특정 꼭지점 위치를 비교하여 정렬합니다. 하지만 실제 활용도는 낮고 이해도 복잡하므로 생략합니다.

결론

'character' 모드는 문서 레이아웃 분석에 적합하며, 영역들의 줄 구성 방식을 정확히 파악하는 것이 중요합니다. 'first_point' 모드는 단순한 좌표 기준 정렬이 필요한 경우 유용하게 사용할 수 있습니다.

태그: halcon image-processing region-sorting computer-vision machine-vision

5월 29일 05:10에 게시됨