코딩 없이 개발하는 FLImaging SNAP®에 대한 튜토리얼

1 FLImaging SNAP®

1.1 FLImaging SNAP® 개요

FLImaging® 의 FLImaging SNAP® 은
Sequential Node Automation Programming 의 약자로,
복잡한 코딩 없이 이미지 프로세싱 시퀀스를 간단히 구현할 수 있는 기술입니다. 프로그램 요소를 블록처럼 배치하고 연결하여 시각적으로 프로그램을 설계할 수 있습니다.
이를 통해 초보자도 프로그램 구조를 쉽게 이해하고 설계할 수 있습니다.
FLImaging SNAP®은 C++/C# 등의 코드 작성 없이 알고리즘 구동이 가능합니다.
디버깅 모드를 통해 프로그램 실행 상태를 실시간으로 확인할 수 있습니다.

1.2 FLImaging SNAP® 개발 환경 설정

FLImaging SNAP® 개발을 시작하기에 앞서 개발 환경을 설정해야 합니다.

메뉴의 View Manager에서 SNAP View를 생성하거나, Fixed View Preset에서 Hybrid SNAP Developement Mode 또는 SNAP Development Mode로 설정합니다.

작업 목적에 따라 적합한 모드를 선택하여 효율적인 개발 환경을 구성하시기 바랍니다.

View Manager
Fig. View Manager

2 구성 요소

2.1 노드(Node)

2.2 간선(Edge)

2.3 블록(Block)

3 Node

SNAP Node는 FLImaging SNAP®의 핵심 구성 요소로, 프로그램의 개별 작업 단위를 나타냅니다. 각 노드는 독립적인 작업 단위로 설계되어, 프로그램의 구조를 유연하게 구성할 수 있습니다. 노드를 연결해 작업 흐름을 설계하며, 필요에 따라 입출력 요소가 존재합니다.

3.1 SNAP Object

Node는 메뉴의 SNAP Objects 카테고리에서 선택하여 SNAP View에 드래그 앤드 드롭으로 생성할 수 있습니다. 알고리즘 노드를 사용할 경우 메뉴에서 알고리즘을 검색한 뒤, 동일한 방식으로 생성할 수 있습니다.

SNAP Objects
Fig. SNAP Objects

3.2 Controls

Controls 카테고리는 SNAP에서 프로그램의 흐름과 실행 제어를 담당하는 노드들로 구성됩니다.

Controls Node Category
Fig. Controls Node Category
  1. Break
    • 현재 실행 중인 For문 루프를 강제로 종료합니다.
    • 특정 조건에 따라 반복 작업을 중단하고 다음 단계로 이동할 때 사용합니다.
  2. Delay
    • 지정된 시간(밀리초) 동안 실행 중인 작업을 일시적으로 중지합니다.
  3. For
    • 정해진 횟수만큼 반복 작업을 실행합니다.
  4. If
    • 조건을 설정하고, 조건에 따라 작업 흐름을 분기합니다.
  5. Pause
    • 프로그램 실행을 일시 중지합니다.
    • 중단 후 단축키 F5 혹은 Run 버튼을 클릭하면 중지 시점부터 작업을 재개합니다.
  6. Restart
    • SNAP 프로그램을 정지 후 재시작합니다.
  7. Stop
    • 프로그램 실행을 즉시 중지합니다.
    • 특정 예외 케이스에서 작업을 중지해야 할 때 사용합니다.
  8. Switch
    • 특정 조건 값에 따라 여러 작업 흐름 중 하나를 선택합니다.

3.3 Function

다양한 연산 및 변환 기능을 제공하는 카테고리로, 주로 데이터 처리, 기하학적 연산, 문자열 조작, 보간 및 매핑 연산을 수행합니다. 연산 유형에 따라 Figure, Generic, Mapping, String의 하위 카테고리로 구성됩니다.

Function Node Category
Fig. Function Node Category
  1. Figure
    • Figure에서 지원하는 기하학적 연산 함수들을 제공합니다.
  2. Generic
    • 데이터를 처리하거나 변환하는 다양한 연산 함수들을 제공합니다.
      수학 연산, 논리 연산, 문자열 처리 등 여러 작업을 수행할 수 있습니다.
    • Operator
      • 단일 타입에 대한 산술, 비교 연산뿐만 아니라 클래스 또는 구조체에 대해 지원하는 연산자 오버로딩을 수행하는 기능을 제공합니다.
      • 예 : Array 두 개를 각각 Value 1, Value 2로 설정하고 Operator - Add 작업을 수행하면, Value 1 배열의 뒤에 Value 2가 추가된 배열이 반환됩니다.
  3. Mapping
    • 다양한 보간 및 변환 기법을 활용하여 데이터를 새로운 값으로 매핑하는 기능을 제공합니다.
  4. Matrix
    • 행렬 연산에 필요한 함수들을 제공합니다.
  5. Special
    • Camera Calibrator Convert Coordinate
      • Camera Calibrator 알고리즘에서 측정한 왜곡 계수 및 내부 파라미터를 이용하여 좌표를 변환해주는 함수입니다.
    • Orthogonal Calibrator Convert Coordinate
      • Orthogonal Calibrator 알고리즘에서 측정한 왜곡 계수 및 내부 파라미터를 이용하여 좌표를 변환해주는 함수입니다.
  6. String
    • 문자열 관련 함수를 제공합니다.

3.4 Generic

Generic 카테고리는 SNAP에서 일반적으로 사용되는 데이터 타입과 구조를 다루는 노드들로 구성됩니다. 데이터를 저장, 처리, 변환하는 데 필요한 다양한 기능을 제공합니다.

Generic Node Category
Fig. Generic Node Category
  1. Arrays, Arrays2, Multi Variables
    • 동일한 데이터 타입의 데이터를 배열로 저장하고 관리합니다. 인덱스를 사용하여 데이터에 접근할 수 있습니다.
    • Arrays: 단순 데이터뿐만 아니라 구조체(Point, Point3 등)도 지원합니다.
    • Arrays2: 2차원 배열 데이터를 처리합니다.
    • Multi Variables: int32, float 등 단순 데이터 타입만 지원합니다.
      • Multi Variable은 단순 데이터 타입만 지원하며, Array는 단순 데이터뿐만 아니라 Point, Point3, Point4 등 구조체도 지원하는 배열입니다.
  2. Figure
    • 다양한 도형 객체 노드를 제공합니다.
  3. Figure
    • 알고리즘 동작 시 ROI 영역을 지정하거나, 이미지 Layer에 Figure 영역을 표시하여 추가 정보를 표시용으로 사용됩니다.
  4. Matrix
    • 행렬 데이터를 관리하는 노드입니다.
  5. Variables
    • 단일 데이터 또는 구조체를 관리합니다.
    • 예: Point, Point3, Point4 (2, 3, 4개의 좌표를 저장하는 구조체).
  6. 3D Object, 3D Object Height Map
    • 3D 개발 환경에서 사용되는 노드입니다. 3D Object 또는 이미지를 로드하여 사용합니다.
  7. 3D View Camera
    • 3D View의 시점을 설정하는 노드입니다.
  8. Block
    • 여러 노드로 연결된 복잡한 작업을 하나의 블록으로 그룹화하여 관리합니다.
  9. File
  1. Image
  1. Sheet
    • 데이터를 표 형태로 관리하고 시각화하는 노드입니다.

3.5 Special

Special 카테고리는 특수 데이터 처리를 위한 노드들로 구성됩니다. 주로 알고리즘 실행 후 결과가 이미지 외의 데이터일 때 사용됩니다.

Special Node Category
Fig. Special Node Category

아래는 SNAP Examples Pane의 Blob 예제에서 Special Node가 사용되는 경우입니다. Blob 연산 결과를 Blob Result 노드에 연결하여 개별 결과를 확인할 수 있습니다.

Special Node Category
Fig. Blob Result

3.6 System

System Node Category
Fig. System Node Category
  1. RTC, Real Time Clock
    1. Date
      • 현재 날짜를 설정한 포맷에 맞춰 문자열(String)로 반환합니다.
    2. Time
      • 현재 시각을 설정한 포맷에 맞춰 문자열(String)로 반환합니다.
  2. Create/Delete Folder
    • 설정한 경로의 폴더를 생성하거나 삭제합니다.
  3. Fixed View Placement Set
    • Preset을 설정합니다.
    • SNAP 동작 중 시퀀스가 해당 노드를 만나는 시점에 설정한 Preset으로 변경됩니다.
  4. File/Folder Existence
    • 입력한 경로의 파일 또는 폴더가 존재하는지 확인합니다.
  5. File/Folder List
    • 입력한 경로에 파일 또는 폴더 리스트를 반환합니다.
  6. Log
  1. Process Result
  1. Processing Unit
  1. SNAP File Information
  1. System Information

4 SNAP View 사용 방법

4.1 Node 생성 방법

Int32 타입 노드를 생성해 보겠습니다.

  1. 사용할 노드를 메뉴에서 찾습니다.

    Finding Int32 node
    Fig. Finding Int32 node
  2. 마우스 왼쪽 버튼으로 선택한 후 SNAP View에 드래그 앤드 드롭으로 해당 노드를 생성합니다.

    • 마우스를 올려놓으면 해당 노드의 Input과 Output 리스트가 표시됩니다.
      • Input : 다른 노드에서 값을 입력받는 부분 (위)
      • Output : 다른 노드에 값을 전달하는 부분 (아래)
    Create Node
    Fig. Create Node

  3. 노드의 왼쪽 핀 버튼을 클릭하면 Input과 Output 리스트의 표시 상태를 고정할 수 있습니다.

    • 핀 버튼이 활성화된 상태에서는 I/O 리스트가 항상 표시되거나 숨겨진 상태를 유지합니다.
    • 노드를 두 번 클릭하면 I/O 리스트의 표시 상태를 변경할 수 있습니다.
    • Ctrl + E, Ctrl + H 단축키를 사용하여 I/O 리스트의 표시 상태를 고정할 수 있습니다.
      • Ctrl + E : 노드의 I/O 리스트를 확장된 상태로 고정
      • Ctrl + H : 노드의 I/O 리스트를 현재 상태로 고정
    Int32 Node on SNAP View
    Fig. Int32 Node on SNAP View
  4. SNAP View 프로퍼티에서 해당 Parameter를 직접 설정합니다.

    Paramter Setting
    Fig. Parameter Setting (Value : 5)
  5. 키보드의 Delete 키를 누르거나 마우스 오른쪽 버튼을 클릭하여 팝업 메뉴에서 Delete를 클릭하면 생성한 노드를 제거할 수 있습니다.

4.2 Edge를 사용하여 Node 연결

간선(Edge) 은 두 개의 노드를 연결하여 데이터 송수신과 실행 순서를 설정하는 데 사용됩니다. SNAP View에서 간선은 프로그램의 논리적 흐름과 데이터 흐름을 시각적으로 나타냅니다.

두 개의 Int32 타입 노드를 Point에 연결하여 x, y 좌표를 설정하는 과정입니다.

  1. 사용할 노드를 생성합니다.
    • Int32 노드는 각각 3, 5로 값을 설정하고, Point 노드 기본 상태로 둡니다.
    Create nodes
    Fig. Create nodes
  2. Int32의 Output을 Point의 X와 Y Input에 연결합니다.
    마우스 왼쪽 버튼을 클릭한 채로 드래그하여 연결합니다.
    Connect nodes GIF
    Connect nodes with edges1
    Fig. Connect nodes with edges
  3. 각 노드 앞에 None이 숫자로 바뀌었습니다. 각 숫자는 동작 순서를 의미합니다.
    • F10을 누르거나 Run Step 버튼을 클릭하여 실행하면 설정된 시퀀스대로 동작하는 것을 확인할 수 있습니다.
    Sequence Check
    Fig. Sequence check
  4. Point 노드를 확인합니다.
    • X, Y값에 각각 3, 5가 저장되었습니다.
    Result of Point node
    Fig. Result of Point node
  5. 이번에는 연결된 간선을 클릭하여 노드 제거와 동일한 방법으로 제거한 뒤, Ctrl 키를 누른 채로 노드를 연결합니다.
    • 값 전달 없이 시퀀스 순서만 설정됩니다.
    • Input 또는 Output이 없는 Node를 연결할 때도 Ctrl 키를 눌러 시퀀스를 설정할 수 있습니다.
    Set sequence GIF
    Set sequence
    Fig. Set sequence

4.3 Block을 사용한 작업 그룹화

블록(Block) 은 여러 노드와 간선으로 이루어진 복잡한 작업을 하나의 단위로 묶어 관리하고 재사용성을 높이는 데 사용됩니다. 이를 통해 SNAP View의 복잡성을 줄이고, 작업 흐름을 더 직관적으로 설계할 수 있습니다.

  1. 블록으로 묶을 노드들을 드래그하여 선택합니다.
  2. 마우스 오른쪽 버튼을 클릭하고 Block Bind를 선택합니다. 또는 Block 노드를 메뉴에서 생성한 후, 묶을 노드를 Block 노드에 드래그 앤드 드롭하면 블록으로 감쌀 수 있습니다.
    Block Bind GIF
    Block Bind
    Block Group
    Fig. Block Bind
  3. 블록 외부와 데이터를 송수신하기 위해서는 송수신하려는 데이터를 Block과 연결해 주어야 합니다. Input 데이터를 블록의 왼쪽, Output 데이터를 블록의 오른쪽과 연결하면, 블록 외부로부터 값을 받거나 외부로 전달할 수 있습니다.
    Block Input GIF
    Block Input
    Block Ouput
    Fig. Block Input/Ouput

4.4 노드의 이름 설정

노드는 이름을 설정할 수 있습니다. 노드 선택 후 Ctrl + N 단축키 또는 마우스 우클릭 -> "Set Variable Name" 버튼을 클릭합니다.

Set Node Name
Set Node Name Dialog
Naming Test
Fig. Set Node Name

노드 이름 설정의 장점

5 개발 실습

먼저 알고리즘 클래스 사용 방법 튜토리얼을 참고하여 FLImaging® 기반의 기본 개념을 익히세요. 이를 통해 FLImaigng SNAP®을 활용한 실습 과정을 보다 쉽게 이해할 수 있습니다.

5.1 이미지 로드 및 출력

  1. Image 노드와 Image View 노드를 생성하고, 각각 Source Image와 Source Image View로 이름을 설정합니다. Ctrl + N 또는 마우스 오른쪽 버튼 클릭 -> Set Name을 선택하여 설정할 수 있습니다.

    Image Node
    Fig. Create nodes & Set name
  2. Image View 노드에서 SNAP View Property 창을 사용해 이미지 파일 경로를 지정합니다.

    Image File Path
    Fig. Set image file path
  3. Source Image와 Source Image View를 연결한 후 F5 또는 Execute 버튼을 눌러 이미지를 출력합니다.

    Image View GIF
    Fig. Image View Execute

5.2 Image View에 Figure Text 출력하기

  1. Figure Text 노드를 생성한 뒤 아래와 같이 필요한 세부 파라미터를 설정합니다.
    Figure Text Settings
    Fig. Figure Text Settings
  2. Figure Text를 Image View에 연결한 뒤 실행합니다.
    Figure Text GIF
    Fig. Figure Text Execute

5.3 알고리즘 노드 연결 및 결과 확인

  1. 사용하고자 하는 알고리즘 노드를 생성하고, 필요한 Input 파라미터를 설정합니다. 예제에서는 Rotation 알고리즘을 사용했습니다.
    Rotation node
    Fig. Rotation node
  2. Source Image View의 Output - Image를 Rotation 알고리즘의 Input - Source Image에 연결합니다.
    Set Source Image
    Fig. Set Source Image
  3. Rotation 파라미터를 설정합니다.
    Rotation Parameter
    Fig. Rotation Parameter
  4. Destination View 노드를 생성하고 Rotation 노드의 Output - Destination Image와 연결한 뒤 실행합니다.
    Destination View
    Fig. Create & Link Destination View node

    Rotation Execute
    Fig. Rotation Execute

5.4 For문을 사용한 반복 작업

Rotation 알고리즘을 반복하여 Destination Image View의 결과가 회전하듯이 보이도록 해보겠습니다. 반복 작업에 필요한 작업은 Rotation, Destination Image View 출력이므로 해당 노드들을 Block으로 그룹화해야 합니다.

  1. Rotation, Destination Image View, Figure Text 노드를 그룹화합니다. 그룹화하려는 노드는 외부 노드와 연결되지 않아야 합니다. 따라서 Source Image View와 Rotation 노드 간에 연결된 간선을 삭제합니다.
    Rotation Block
    Rotation Block
    Fig. Block Bind
  2. Block 노드에 Input을 생성하여, 외부에서 Rotation의 AngleSource Image를 전달받도록 설정합니다.
    Set Block Input GIF
    Set Block Input
    Fig. Set Block Input
  3. Controls Node인 For 노드를 생성한 뒤, Loop Count를 30으로 설정합니다. 이후 For 노드의 Iteration Value와 Source Image View의 Image를 Block의 Input과 연결합니다.
    Set Loop Count
    Link Block Input GIF
    Link Block Input
    Fig. Link Block Input
  4. Execute를 눌러 실행하면, 이미지가 1도씩 회전하며 0도부터 29도까지 반복됩니다.
    Rotation Loop Result GIF
    Rotation Loop Result
    Fig. Rotation Loop Result

6 SNAP Examples

SNAP Examples Pane에서 알고리즘을 검색하고, 예제 파일을 열어 사용 방법을 학습할 수 있습니다.

SNAP Examples
Fig. SNAP Examples