코딩 없이 개발하는 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로 설정합니다.
- Hybrid SNAP Development Mode: SNAP 개발 외 다른 작업도 병행해야 할 때 적합합니다.
- SNAP Development Mode: SNAP 개발에 최적화된 환경을 제공합니다.
작업 목적에 따라 적합한 모드를 선택하여 효율적인 개발 환경을 구성하시기 바랍니다.

2 구성 요소
2.1 노드(Node)
- SNAP 작업의 기본 단위로, 특정 기능이나 연산을 수행합니다.
- 데이터 입력, 처리, 출력을 담당합니다.
2.2 간선(Edge)
- 노드 간의 데이터 흐름이나 작업 순서를 연결하는 선입니다.
- 프로그램의 논리적 흐름을 정의합니다.
2.3 블록(Block)
- 관련된 노드와 간선을 그룹화하여 하나의 작업 단위로 묶은 구조입니다.
- 복잡한 작업을 간단히 관리하고 재사용성을 높입니다.
3 Node
SNAP Node는 FLImaging SNAP®의 핵심 구성 요소로, 프로그램의 개별 작업 단위를 나타냅니다. 각 노드는 독립적인 작업 단위로 설계되어, 프로그램의 구조를 유연하게 구성할 수 있습니다. 노드를 연결해 작업 흐름을 설계하며, 필요에 따라 입출력 요소가 존재합니다.
3.1 SNAP Object
Node는 메뉴의 SNAP Objects 카테고리에서 선택하여 SNAP View에 드래그 앤드 드롭으로 생성할 수 있습니다. 알고리즘 노드를 사용할 경우 메뉴에서 알고리즘을 검색한 뒤, 동일한 방식으로 생성할 수 있습니다.

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

- Break
- 현재 실행 중인 For문 루프를 강제로 종료합니다.
- 특정 조건에 따라 반복 작업을 중단하고 다음 단계로 이동할 때 사용합니다.
- Delay
- 지정된 시간(밀리초) 동안 실행 중인 작업을 일시적으로 중지합니다.
- For
- 정해진 횟수만큼 반복 작업을 실행합니다.
- If
- 조건을 설정하고, 조건에 따라 작업 흐름을 분기합니다.
- Pause
- 프로그램 실행을 일시 중지합니다.
- 중단 후 단축키
F5
혹은 Run 버튼을 클릭하면 중지 시점부터 작업을 재개합니다.
- Restart
- SNAP 프로그램을 정지 후 재시작합니다.
- Stop
- 프로그램 실행을 즉시 중지합니다.
- 특정 예외 케이스에서 작업을 중지해야 할 때 사용합니다.
- Switch
- 특정 조건 값에 따라 여러 작업 흐름 중 하나를 선택합니다.
3.3 Function
다양한 연산 및 변환 기능을 제공하는 카테고리로, 주로 데이터 처리, 기하학적 연산, 문자열 조작, 보간 및 매핑 연산을 수행합니다. 연산 유형에 따라 Figure, Generic, Mapping, String의 하위 카테고리로 구성됩니다.

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

- Arrays, Arrays2, Multi Variables
- 동일한 데이터 타입의 데이터를 배열로 저장하고 관리합니다. 인덱스를 사용하여 데이터에 접근할 수 있습니다.
- Arrays: 단순 데이터뿐만 아니라 구조체(Point, Point3 등)도 지원합니다.
- Arrays2: 2차원 배열 데이터를 처리합니다.
- Multi Variables: int32, float 등 단순 데이터 타입만 지원합니다.
- Multi Variable은 단순 데이터 타입만 지원하며, Array는 단순 데이터뿐만 아니라 Point, Point3, Point4 등 구조체도 지원하는 배열입니다.
- Figure
- 다양한 도형 객체 노드를 제공합니다.
- Figure
- 알고리즘 동작 시 ROI 영역을 지정하거나, 이미지 Layer에 Figure 영역을 표시하여 추가 정보를 표시용으로 사용됩니다.
- Matrix
- 행렬 데이터를 관리하는 노드입니다.
- Variables
- 단일 데이터 또는 구조체를 관리합니다.
- 예: Point, Point3, Point4 (2, 3, 4개의 좌표를 저장하는 구조체).
- 3D Object, 3D Object Height Map
- 3D 개발 환경에서 사용되는 노드입니다. 3D Object 또는 이미지를 로드하여 사용합니다.
- 3D View Camera
- 3D View의 시점을 설정하는 노드입니다.
- Block
- 여러 노드로 연결된 복잡한 작업을 하나의 블록으로 그룹화하여 관리합니다.
- File
- CSV, Figure, Image 등 모든 종류의 파일 형식을 처리할 수 있는 범용적인 노드입니다.
- Image
- 이미지 파일을 불러오기 위해 사용하는 노드입니다.
- Sheet
- 데이터를 표 형태로 관리하고 시각화하는 노드입니다.
3.5 Special
Special 카테고리는 특수 데이터 처리를 위한 노드들로 구성됩니다. 주로 알고리즘 실행 후 결과가 이미지 외의 데이터일 때 사용됩니다.

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

3.6 System

- RTC, Real Time Clock
- Date
- 현재 날짜를 설정한 포맷에 맞춰 문자열(String)로 반환합니다.
- Time
- 현재 시각을 설정한 포맷에 맞춰 문자열(String)로 반환합니다.
- Date
- Create/Delete Folder
- 설정한 경로의 폴더를 생성하거나 삭제합니다.
- Fixed View Placement Set
- Preset을 설정합니다.
- SNAP 동작 중 시퀀스가 해당 노드를 만나는 시점에 설정한 Preset으로 변경됩니다.
- File/Folder Existence
- 입력한 경로의 파일 또는 폴더가 존재하는지 확인합니다.
- File/Folder List
- 입력한 경로에 파일 또는 폴더 리스트를 반환합니다.
- Log
- Log Window에 설정한 문자열을 기록합니다.
- Process Result
- 노드의 프로세스 수행 결과를 반환합니다.
- Processing Unit
- Processing Unit을 설정합니다.
- SNAP 동작 중 시퀀스가 해당 노드를 만나는 시점에 설정한 Processing Unit으로 변경됩니다.
이후 동작되는 알고리즘은 설정된 Processing Unit으로 동작합니다.
- SNAP File Information
- 파일 이름, 경로 등 현재 SNAP 파일에 대한 정보를 제공합니다.
- System Information
- 시스템 정보를 반환합니다.
- 전체 메모리 용량 및 사용 가능한 메모리를 확인할 수 있습니다.
4 SNAP View 사용 방법
4.1 Node 생성 방법
Int32 타입 노드를 생성해 보겠습니다.
-
사용할 노드를 메뉴에서 찾습니다.
Fig. Finding Int32 node -
마우스 왼쪽 버튼으로 선택한 후 SNAP View에 드래그 앤드 드롭으로 해당 노드를 생성합니다.
- 마우스를 올려놓으면 해당 노드의 Input과 Output 리스트가 표시됩니다.
- Input : 다른 노드에서 값을 입력받는 부분 (위)
- Output : 다른 노드에 값을 전달하는 부분 (아래)
Fig. Create Node
- 마우스를 올려놓으면 해당 노드의 Input과 Output 리스트가 표시됩니다.
-
노드의 왼쪽 핀 버튼을 클릭하면 Input과 Output 리스트의 표시 상태를 고정할 수 있습니다.
- 핀 버튼이 활성화된 상태에서는 I/O 리스트가 항상 표시되거나 숨겨진 상태를 유지합니다.
- 노드를 두 번 클릭하면 I/O 리스트의 표시 상태를 변경할 수 있습니다.
Ctrl + E
,Ctrl + H
단축키를 사용하여 I/O 리스트의 표시 상태를 고정할 수 있습니다.Ctrl + E
: 노드의 I/O 리스트를 확장된 상태로 고정Ctrl + H
: 노드의 I/O 리스트를 현재 상태로 고정
Fig. Int32 Node on SNAP View -
SNAP View 프로퍼티에서 해당 Parameter를 직접 설정합니다.
Fig. Parameter Setting (Value : 5) -
키보드의
Delete
키를 누르거나 마우스 오른쪽 버튼을 클릭하여 팝업 메뉴에서 Delete를 클릭하면 생성한 노드를 제거할 수 있습니다.
4.2 Edge를 사용하여 Node 연결
간선(Edge) 은 두 개의 노드를 연결하여 데이터 송수신과 실행 순서를 설정하는 데 사용됩니다. SNAP View에서 간선은 프로그램의 논리적 흐름과 데이터 흐름을 시각적으로 나타냅니다.
두 개의 Int32 타입 노드를 Point에 연결하여 x, y 좌표를 설정하는 과정입니다.
- 사용할 노드를 생성합니다.
- Int32 노드는 각각 3, 5로 값을 설정하고, Point 노드 기본 상태로 둡니다.
Fig. Create nodes - Int32의 Output을 Point의 X와 Y Input에 연결합니다.
마우스 왼쪽 버튼을 클릭한 채로 드래그하여 연결합니다.Fig. Connect nodes with edges - 각 노드 앞에 None이 숫자로 바뀌었습니다. 각 숫자는 동작 순서를 의미합니다.
F10
을 누르거나 Run Step 버튼을 클릭하여 실행하면 설정된 시퀀스대로 동작하는 것을 확인할 수 있습니다.
Fig. Sequence check - Point 노드를 확인합니다.
- X, Y값에 각각 3, 5가 저장되었습니다.
Fig. Result of Point node - 이번에는 연결된 간선을 클릭하여 노드 제거와 동일한 방법으로 제거한 뒤,
Ctrl
키를 누른 채로 노드를 연결합니다.- 값 전달 없이 시퀀스 순서만 설정됩니다.
- Input 또는 Output이 없는 Node를 연결할 때도
Ctrl
키를 눌러 시퀀스를 설정할 수 있습니다.
Fig. Set sequence
4.3 Block을 사용한 작업 그룹화
블록(Block) 은 여러 노드와 간선으로 이루어진 복잡한 작업을 하나의 단위로 묶어 관리하고 재사용성을 높이는 데 사용됩니다. 이를 통해 SNAP View의 복잡성을 줄이고, 작업 흐름을 더 직관적으로 설계할 수 있습니다.
- 블록으로 묶을 노드들을 드래그하여 선택합니다.
- 마우스 오른쪽 버튼을 클릭하고 Block Bind를 선택합니다.
또는 Block 노드를 메뉴에서 생성한 후, 묶을 노드를 Block 노드에 드래그 앤드 드롭하면 블록으로 감쌀 수 있습니다.
Fig. Block Bind - 블록 외부와 데이터를 송수신하기 위해서는 송수신하려는 데이터를 Block과 연결해 주어야 합니다. Input 데이터를 블록의 왼쪽, Output 데이터를 블록의 오른쪽과 연결하면, 블록 외부로부터 값을 받거나 외부로 전달할 수 있습니다.
Fig. Block Input/Ouput
4.4 노드의 이름 설정
노드는 이름을 설정할 수 있습니다. 노드 선택 후 Ctrl + N
단축키 또는 마우스 우클릭 -> "Set Variable Name" 버튼을 클릭합니다.



노드 이름 설정의 장점
- 동작 구조 이해도 향상
- 노드에 의미 있는 이름을 지정하면 실행 시 각 노드의 역할을 쉽게 파악할 수 있습니다.
- 데이터 동기화 및 공유
- 타입과 이름이 같은 노드는 동일한 객체로 간주되어 데이터가 동기화됩니다.
- 유연한 데이터 흐름 조작
- 복잡한 작업 단위에서 필요한 데이터를 간선 연결 없이 가져와 사용할 수 있습니다.
- 시퀀스 흐름을 단순화하여 불필요한 간선을 줄일 수 있습니다.
- 유지보수 및 가독성 향상
- 동일한 데이터를 여러 노드에서 사용할 때, 이름을 통해 쉽게 참조할 수 있어 유지보수가 용이합니다.
5 개발 실습
먼저 알고리즘 클래스 사용 방법 튜토리얼을 참고하여 FLImaging® 기반의 기본 개념을 익히세요. 이를 통해 FLImaigng SNAP®을 활용한 실습 과정을 보다 쉽게 이해할 수 있습니다.
5.1 이미지 로드 및 출력
-
Image 노드와 Image View 노드를 생성하고, 각각 Source Image와 Source Image View로 이름을 설정합니다.
Ctrl + N
또는 마우스 오른쪽 버튼 클릭 -> Set Name을 선택하여 설정할 수 있습니다.Fig. Create nodes & Set name -
Image View 노드에서 SNAP View Property 창을 사용해 이미지 파일 경로를 지정합니다.
Fig. Set image file path -
Source Image와 Source Image View를 연결한 후
F5
또는 Execute 버튼을 눌러 이미지를 출력합니다.Fig. Image View Execute
5.2 Image View에 Figure Text 출력하기
- Figure Text 노드를 생성한 뒤 아래와 같이 필요한 세부 파라미터를 설정합니다.
Fig. Figure Text Settings - Figure Text를 Image View에 연결한 뒤 실행합니다.
Fig. Figure Text Execute
5.3 알고리즘 노드 연결 및 결과 확인
- 사용하고자 하는 알고리즘 노드를 생성하고, 필요한 Input 파라미터를 설정합니다. 예제에서는 Rotation 알고리즘을 사용했습니다.
Fig. Rotation node - Source Image View의 Output - Image를 Rotation 알고리즘의 Input - Source Image에 연결합니다.
Fig. Set Source Image - Rotation 파라미터를 설정합니다.
Fig. Rotation Parameter - Destination View 노드를 생성하고 Rotation 노드의 Output - Destination Image와 연결한 뒤 실행합니다.
Fig. Create & Link Destination View node Fig. Rotation Execute
5.4 For문을 사용한 반복 작업
Rotation 알고리즘을 반복하여 Destination Image View의 결과가 회전하듯이 보이도록 해보겠습니다. 반복 작업에 필요한 작업은 Rotation, Destination Image View 출력이므로 해당 노드들을 Block으로 그룹화해야 합니다.
- Rotation, Destination Image View, Figure Text 노드를 그룹화합니다. 그룹화하려는 노드는 외부 노드와 연결되지 않아야 합니다.
따라서 Source Image View와 Rotation 노드 간에 연결된 간선을 삭제합니다.
Fig. Block Bind - Block 노드에 Input을 생성하여, 외부에서 Rotation의 Angle 및 Source Image를 전달받도록 설정합니다.
Fig. Set Block Input - Controls Node인 For 노드를 생성한 뒤, Loop Count를 30으로 설정합니다. 이후 For 노드의 Iteration Value와 Source Image View의 Image를 Block의 Input과 연결합니다.
Fig. Link Block Input - Execute를 눌러 실행하면, 이미지가 1도씩 회전하며 0도부터 29도까지 반복됩니다.
Fig. Rotation Loop Result
6 SNAP Examples
SNAP Examples Pane에서 알고리즘을 검색하고, 예제 파일을 열어 사용 방법을 학습할 수 있습니다.
