어플리케이션 노트: 프로그래머블 프레임 그래버용 신호 처리 앱릿 설계#
VisualApplets의 GPI/GPO Operators#
VisualApplets를 사용하여 애플리케이션에 특화된 자신만의 트리거 시스템을 설계할 수 있습니다. 예를 들어 어떤 신호가 어떤 개별 물리적 I/O 핀에 의해 송수신되는지 결정할 수 있습니다.
VisualApplets에서는 개별 핀을 applet 디자인과 연결하는 데 사용할 수 있는 두 가지 연산자를 제공합니다.
연산자 GPI(트리거 IN 신호용)
연산자 GPO(트리거 OUT 신호용)

위 그림은 신호 처리를 구현하는 방법의 예를 보여줍니다. 구현하려는 신호 처리 기능은 특정 요구 사항에 따라 다릅니다. 애플리케이션에 적합한 Operator를 찾으려면 Signal Library를 방문하십시오. 또한 요구 사항에 따라 Front GPIO를 선택하십시오.
위의 예는 두 개의 입력 신호에 대한 다운스케일링 기능을 보여줍니다. 두 개의 신호가 GPI1 및 Front GPI0에서 프로그래머블 프레임 그래버로 입력됩니다. 신호는 먼저 디바운싱되고, 상승 또는 하강 에지가 선택되며, 신호는 8 또는 3의 팩터로 다운스케일됩니다. 두 신호의 신호 길이가 설정된 다음 FrontGPO0, GPO1, GPO2 및 카메라로 전달되어 이미지 취득을 제어합니다.
GPI/GPO Operators 사용 방법#
Front GPIO 또는 Trigger Extension Board에서 사용하려는 각 트리거 IN/트리거 OUT 핀은 GPI/GPO 연산자의 인스턴스와 상호 연결되어야 합니다.
정보
연산자 GPI와 연산자 GPO는 동일한 기능을 가지므로 이하에서는 두 연산자를 함께 설명합니다.
- 디자인에서 Operator 아이콘을 더블 클릭하여 Module Properties 창을 엽니다.

Module Properties 창이 열립니다.

보시다시피 연산자에는 두 개의 매개변수가 있습니다.
Pin_ID: Pin_ID 매개변수를 사용하면 선택한 커넥터에서 주소 지정할 개별 핀을 정의할 수 있습니다.ConnectorType: ConnectorType 매개변수를 사용하면 주소 지정할 커넥터(Front GPIO 또는 GPIO를 통한 Trigger Extension Board)를 정의할 수 있습니다.
정보
CXP-12 프레임 그래버의 경우 ConnectorType parameter는 다음 항목에 포함됩니다. Pin_ID 파라미터.
Parameter Connector Type#
이 parameter를 사용하면 제어할 트리거 핀 그룹, 즉 15핀 D-Sub 소켓에 있는 핀(Front GPIO) 또는 Trigger Extension Board에 있는 핀(GPIO) 중 어느 것을 지정할지 정의할 수 있습니다. 이 parameter의 값 범위는 {Front GPIO, GPIO}입니다.
Value Front GPIO#
값으로 다음을 선택하는 경우 Front GPIO, 프로그래머블 프레임 그래버의 슬롯 브래킷에 있는 다음 커넥터(트리거 핀 그룹)가 지정됩니다.

Value GPIO#
값으로 다음을 선택하는 경우 GPIO, 프로그래머블 프레임 그래버의 다음 트리거 핀 그룹이 지정됩니다.

GPIO는 Trigger Extension Board와의 연결에 사용됩니다.

Parameter Pin_ID#
이 parameter를 사용하면 선택한 커넥터(트리거 핀 그룹)에서 제어할 개별 핀을 정의할 수 있습니다. 다음 parameter의 값 범위는 Pin_ID is {0;7} or {0;3} for connector type GPIO 또는 Front GPIO.
정보
다음 parameter의 값 범위는 Pin_ID for marathon frame grabbers and operator GPO is {0;1}.
VisualApplets Operator Reference를 사용한 프론트 GPIO 핀 구성#


차동 모드에서는 핀 9를 사용하여 Pin_ID=3인 GPI 오퍼레이터에서 하나의 싱글엔드 신호를 수신할 수 있습니다. "Differential" 모드(기본값)를 참조하십시오.
주의
프레임 그래버 트리거 시스템은 Voltage IN 핀에 공급 전압을 공급받아야 합니다. PWR 핀이 없는 장치를 연결하려면 외부 소스에서 Voltage IN 핀으로 전원 공급을 제공해야 합니다.
프론트 GPIO의 Trigger INPUT#
만약
- 을(를) 사용하는 경우
GPI오퍼레이터(트리거 입력 신호 정의용), - parameter를 설정한 경우
Connector Type(으)로Front GPIO,
다음 parameter의 값은 Pin_ID 다음 핀을 지정합니다:

Front GPIO의 입력(GPI) 핀은 구성 가능합니다. 6개의 입력 핀을 사용하여 다음 중 하나를 수신할 수 있습니다:
- 3개의 차동 신호, 또는
- 2개의 차동 신호 및 1개의 싱글엔드 신호, 또는
- 4개의 싱글엔드 신호.
특정 신호 유형(차동 또는 싱글엔드)에 대해 Front GPIO의 입력 핀을 구성하려면 다음 두 가지 모드를 사용할 수 있습니다.
- Mode
Differential(옵션 a 및 b 제공) - Mode
Single-ended(option c 제공)
Front GPIO의 기본 모드는 모드입니다. Differential모드 전환 방법에 대해서는 다음 항목을 참조하십시오. Input Configuration 프레임 그래버 매뉴얼.
주의
기본 구성에서 Front GPIO의 GPIO 핀은 다음을 제공합니다:
- 3개의 차동 입력 신호 또는 풀업 모드의 2개 차동 및 1개 싱글엔드 입력 신호
- TTL 출력 신호 2개
예를 들어 다음과 같이 입력 신호의 다른 구성이 필요한 경우:
- Pull-down 모드,
- 싱글 엔드(single-ended) 신호 4개(차동 신호 없음),
요구 사항에 따라 GPI를 쉽게 구성할 수 있습니다. 구성하려면 Framegrabber SDK와 함께 시스템에 설치된 명령줄 도구를 사용합니다.
Mode Differential (기본값)#
모드 Differential (기본값)에서 Front GPIO의 6개 입력 핀은 모두 차동 신호를 수신하도록 구성됩니다:
- 핀 8/9 -> 차동 신호 1개
- 핀 11/12 -> 차동 신호 1개
- 핀 13/14 -> 차동 신호 1개
또는 핀 쌍 8/9를 사용하여(모드 Differential) 싱글 엔드 신호 1개를 수신할 수 있습니다:
- 핀 9 -> 싱글 엔드 신호 1개
- 핀 11/12 -> 차동 신호 1개
- 핀 13/14 -> 차동 신호 1개
모드의 개별 핀 Differential:

핀 11 및 12:
- 핀 11과 12의 들어오는 신호는 하나의 차동 신호로 해석됩니다(핀 11은 +, 핀 12는 - 값).
- VisualApplets 내에서 이 차동 신호를 수신하려면 Pin_ID = 0인 GPI 오퍼레이터 인스턴스를 사용하십시오.
핀 13 및 14:
- 핀 13과 14의 들어오는 신호는 하나의 차동 신호로 해석됩니다(핀 13은 +, 핀 14는 - 값).
- VisualApplets 내에서 이 차동 신호를 수신하려면 Pin_ID = 1인 GPI 오퍼레이터 인스턴스를 사용하십시오.
핀 8 및 9:
- 핀 8과 9로 들어오는 신호는 하나의 차동 신호(핀 8은 +, 핀 9는 - 값)로 해석됩니다.
- VisualApplets 내에서 이 차동 신호를 수신하려면 Pin_ID = 2인 GPI operator 인스턴스를 사용하십시오.
또는, 하나의 싱글 엔드 신호를 수신하기 위해 핀 쌍 8/9를 사용할 수도 있습니다(단, 모드 Differential)의 경우: 이 경우,
- 싱글 엔드 입력 신호를 물리적 핀 9에 연결합니다.
- VisualApplets 내에서 이 싱글 엔드 신호를 수신하려면 Pin_ID = 3인 GPI operator 인스턴스를 사용하십시오.
Mode Single-Ended#
모드 Single-ended (구성 가능) Front GPIO의 6개 입력 핀은 4개의 싱글 엔드 신호를 수신하도록 구성됩니다.
- 핀 8 -> 1개의 싱글 엔드 신호
- 핀 9 -> 싱글 엔드 신호 1개
- 핀 11 -> 1개의 싱글 엔드 신호
- 핀 13 -> 1개의 싱글 엔드 신호
모드의 개별 핀 Single-ended:

핀 11 및 12의 신호:
- 핀 11로 들어오는 신호는 싱글 엔드 신호로 해석됩니다.
- VisualApplets 내에서 이 싱글 엔드 신호를 수신하려면 Pin_ID = 0인 GPI operator 인스턴스를 사용하십시오.
- 핀 12는 해당 모드에서 사용되지 않습니다.
Single-ended.
핀 13 및 14의 신호:
- 핀 13으로 들어오는 신호는 싱글 엔드 신호로 해석됩니다.
- VisualApplets 내에서 이 싱글 엔드 신호를 수신하려면 Pin_ID = 1인 GPI operator 인스턴스를 사용하십시오.
- 핀 14는 해당 모드에서 사용되지 않습니다.
Single-ended.
핀 8 및 9:
- 핀 8과 9로 들어오는 신호는 두 개의 싱글 엔드 신호로 해석됩니다.
-
VisualApplets 내에서 이러한 싱글 엔드 신호를 수신하려면
- 핀 8용으로 Pin_ID = 2인 GPI operator 인스턴스를 사용하고,
- 핀 9용으로 Pin_ID = 3인 GPI operator 인스턴스를 사용하십시오.
트리거 출력 TTL Front GPIO의#
만약
- 트리거 출력 신호를 정의하기 위해 GPO operator를 사용하고,
- Connector Type 파라미터를 Front GPIO로 설정한 경우,
Pin_ID 파라미터의 값은 다음 핀을 지정합니다.

이 두 핀은 TTL 신호(5 V)를 전송합니다.
Front GPIO의 나가는 TTL 신호(5 V):

Trigger Extension Board로 향하는 트리거 신호(GPIO를 통해)#
GPIO 커넥터는 트리거 확장 보드에 연결하도록 설계된 프로그래머블 프레임 grabber의 물리적 트리거 인터페이스입니다.

GPIO 커넥터, 즉 각 트리거 확장 보드는 다음을 제공합니다.
- 8개의 디지털 입력(IN 0 - 7)(8개의 싱글엔드 신호 또는 4개의 차동 신호)
- 8개의 디지털 출력(OUT 0 - 7)
8개의 입력은 0에서 7까지의 인덱스를 가집니다. 8개의 출력 역시 0에서 7까지의 인덱스를 가집니다.
핀 레이아웃에 대한 자세한 내용은 Pin Layout on SUB-D15 - TTL Trigger Board 또는 PIN Layout Opto-Coupled Trigger 5 - Opto-Coupled Trigger 5 Board 확장 보드를 참조하십시오.
Pin_ID TTL Trigger Extension Board에서의 할당#
Port A#
| Pin Number | Pin_ID VisualApplets 내 |
|---|---|
| 1 | 0 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | 0 |
| 12 | 1 |
| 13 | 2 |
| 14 | 3 |
| 15 | 0 |
Port B#
| Pin Number | Pin_ID VisualApplets 내(single-ended 신호) |
|---|---|
| 1 | 4 |
| 2 | 5 |
| 3 | 6 |
| 4 | 7 |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | 4 |
| 12 | 5 |
| 13 | 6 |
| 14 | 7 |
| 15 |
Pin_ID Opto Trigger 5 Extension Board에서의 할당#
Port A#
| Pin Number | Pin_ID VisualApplets 내(single-ended 신호) | Pin_ID VisualApplets 내(differential 신호) |
|---|---|---|
| 1 | 0 | |
| 2 | 1 | |
| 3 | 2 | |
| 4 | 3 | |
| 5 | ||
| 6 | ||
| 7 | ||
| 8 | ||
| 9 | ||
| 10 | ||
| 11 | 0 | 0 |
| 12 | 1 | 0 |
| 13 | 2 | 2 |
| 14 | 3 | 2 |
| 15 |
Port B#
| Pin Number | Pin_ID VisualApplets 내(single-ended 신호) | Pin_ID VisualApplets 내(differential 신호) |
|---|---|---|
| 1 | 4 | |
| 2 | 5 | |
| 3 | 6 | |
| 4 | 7 | |
| 5 | ||
| 6 | ||
| 7 | ||
| 8 | ||
| 9 | ||
| 10 | ||
| 11 | 4 | 4 |
| 12 | 5 | 4 |
| 13 | 6 | 6 |
| 14 | 7 | 6 |
| 15 |
트리거 시스템 구성#
트리거 구성에는 다음 두 가지 방법으로 액세스할 수 있습니다.
- microDisplay X: 여기에서 GUI를 통해 트리거 파라미터 값을 입력하여 특정 구성의 결과를 확인할 수 있습니다.
- SDK: 특정 이미지 처리 소프트웨어 애플리케이션에 프레임 grabber 프로그래밍 인터페이스를 구현하기 위한 용도입니다.
트리거 시스템에 대한 요구 사항은 애플리케이션에 따라 다릅니다.
- Area Scan의 경우 하나의 트리거 타입(프레임 트리거)만 필요합니다.
- Line Scan의 경우 라인 트리거(각 라인마다 트리거 펄스 전송)와 프레임 트리거의 두 가지 트리거 타입이 필요합니다. Line scan 애플리케이션에서 프레임 트리거는 이미지에 추가할 라인 수를 제어합니다.
영역 및 라인 스캔 카메라 트리거 방법에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
정보
프레임 그래버 트리거 시스템에 대한 자세한 내용은 GPIO Connectors 항목을 참조하십시오.
정보
사용 가능한 파라미터 및 특정 설정이 미치는 영향에 대한 정보는 사용 중인 applet의 문서를 참조하십시오.
하드웨어에서 앱릿 실행하기#
사전 요구 사항:
- 프로그래밍 가능한 프레임 그래버가 Connecting Frame Grabbers 항목에 설명된 대로 시스템에 설치되어 있어야 합니다.
- Basler Framegrabber SDK가 Installing the Framegrabber SDK에 설명된 대로 시스템에 설치되어 있어야 합니다.
프로그래밍 가능한 프레임 grabber에서 applet을 실행하려면 먼저 다음을 수행해야 합니다. *.hap 파일(applet)을 호스트 PC의 Basler Framegrabber SDK 설치 디렉토리에 복사한 후 프로그래밍 가능한 프레임 grabber에 플래싱합니다.
정보
플래싱은 marathon 프레임 grabber에만 필요합니다.
VisualApplets 디자인을 하드웨어 앱릿으로 변환하는 방법에 대한 자세한 내용은 Hardware Applet: From Idea to Application에서 확인할 수 있습니다.
-
다음을 복사하십시오.
*.hapVisualApplets에서 빌드한 파일을 디렉토리로 이동합니다[Framegrabber SDK installation directory]/Hardware Applets/[frame grabber model]. 프로그래밍 가능한 프레임 grabber 모델 이름을 가진 하위 디렉토리가 없으면 새로 만드십시오. VisualApplets에서 기본 설정을 사용한 경우*.hap파일은 VisualApplets 설치 디렉토리의 하위 디렉토리인Designs. -
Flashing에 설명된 대로 프로그래밍 가능한 프레임 그래버에 앱릿을 설치합니다.
이 작업을 완료한 후 다음을 수행할 수 있습니다.
- Framegrabbers SDK의 일부로 제공되는 Basler 툴 microDisplay X를 사용하여 앱릿을 테스트하고 이미지 처리 결과를 직접 확인할 수 있습니다. Configuring the Applet (microDisplay X) 항목을 참조하십시오.
예: 신호 처리 예제 디자인의 하드웨어 applet을 microDisplay X로 로드할 때 아래 그림과 같이 파라미터 트리에서 다운스케일링 팩터 및 신호 너비와 같은 동적 파라미터를 설정할 수 있습니다.

사용자 지정 소프트웨어에서 애플릿 시작#
자체 소프트웨어에서 applet 사용을 시작하려면:
- Basler 애플리케이션 프로그래밍 인터페이스에서 호출을 사용합니다
Fg_Initapplet을 시작합니다. VisualApplets로 생성한*.hap파일의 위치 경로를 지정하십시오.
사용 가능한 모든 함수 호출에 대한 자세한 설명과 레퍼런스는 Framegrabber API Manual 및 Framegrabber API Function Reference를 참조하십시오.
C++ SDK의 기반으로 VisualApplets 내부 SDK 코드 생성기를 사용할 수 있습니다. 이는 아이콘 메뉴 또는 VisualApplets의 Build 및 Generate SDK example에서 찾을 수 있습니다. 이 함수는 해당 CMake 파일 및 VisualStudio 프로젝트 파일을 자동으로 생성합니다(Hardware Applet: From Idea to Application 참조).
자동 SDK 코드에는 이미지 획득 및 파라미터 구성에 필요한 다음과 같은 기능 블록이 포함되어 있습니다.
- 프레임 grabber 초기화
- 버퍼용 memory 할당
- 정의
Get및SetProperty - 디스플레이 생성
- 현재 각 포트에 대한 앱렛 및 카메라의 획득 시작
- 이미지 취득
- 획득 중지
- 디스플레이 닫기
- 버퍼 메모리 해제
- 프레임 grabber 초기화 해제
다음은 신호 처리 예제에 대한 C++ Framegrabber API 코드 예제입니다.
- Frame Grabber 초기화 및 버퍼용 메모리 할당:
int main ()
{
// ---------------------------------------------------------------------------
// Frame Grabber: Initialization
// ---------------------------------------------------------------------------
int nrOfCycles = 5000; // Acquire 5000 frames, TODO: insert the number according to your needs
unsigned int boardIndex = 0; // TODO: Use the correct board index at multi frame grabber systems
int rc = 0; // return code
Fg_Struct* fg = Fg_Init("SignalProcessingDesign.hap", boardIndex);
if(fg == NULL){
fprintf(stderr, "Error in Fg_Init(): %s\n", Fg_getLastErrorDescription(NULL));
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
return -1;
}
int nrOfParameter = Fg_getNrOfParameter(fg);
fprintf(stderr, "No. of Parameter: %d\n", nrOfParameter);
int i;
for (i = 0; i < nrOfParameter; i++) {
const char *name = Fg_getParameterName(fg,i);
fprintf(stderr," Param %d: %s,%x\n",i,name,Fg_getParameterId(fg,i));
}
/ ---------------------------------------------------------------------------
// Frame Grabber: Allocate memory for buffer(s)
// ---------------------------------------------------------------------------
// Feature Cnt 0,0
int width0 = 1024;
int height0 = 1024;
int byteWidth0 = 1;
size_t bufSize0 = width0 * height0 * (size_t)byteWidth0;
const unsigned int mem0_bufs = 4;
dma_mem *pmem0 = Fg_AllocMemEx(fg, bufSize0 * mem0_bufs, mem0_bufs);
if(pmem0 == NULL){
fprintf(stderr, "Error in Fg_AllocMemEx(): %s\n", Fg_getLastErrorDescription(fg));
Fg_FreeGrabber(fg);
fg = NULL;
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
return -1;
}
- 다음의 발췌 부분:
Get및Set매개변수 섹션. 여기에서는 동적 매개변수를 설정하는 방법을 확인할 수 있습니다. 다음 코드는 다운스케일 팩터를 설정하고 operator의 매개변수로 특정 펄스를 선택하는 방법을 보여줍니다.Device1_Process0_ByFactor8:
// ---------------------------------------------------------------------------
// Frame Grabber: Get* and Set* parameters for Process0
// ---------------------------------------------------------------------------
/*============ Downscale : ByFactor8 ============== */
int Device1_Process0_ByFactor8_Downscale_Id = Fg_getParameterIdByName(fg, "Device1_Process0_ByFactor8_Downscale");
if(Device1_Process0_ByFactor8_Downscale_Id <= 0) {
fprintf(stderr, "\n");
fprintf(stderr, "Error in Fg_getParameterIdByName(Device1_Process0_ByFactor8_Downscale): %s (%d)\n", Fg_getLastErrorDescription(fg), Device1_Process0_ByFactor8_Downscale_Id);
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
}
unsigned int Device1_Process0_ByFactor8_Downscale;
Device1_Process0_ByFactor8_Downscale = 8;
rc = Fg_setParameterWithType(fg, Device1_Process0_ByFactor8_Downscale_Id, Device1_Process0_ByFactor8_Downscale, 0);
if(rc < 0) {
fprintf(stderr, "\n");
fprintf(stderr, "Error in Fg_setParameterWithType(Device1_Process0_ByFactor8_Downscale_Id): %s (%d)\n", Fg_getLastErrorDescription(fg), rc);
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
}
int Device1_Process0_ByFactor8_SelectedPulse_Id = Fg_getParameterIdByName(fg, "Device1_Process0_ByFactor8_SelectedPulse");
if(Device1_Process0_ByFactor8_SelectedPulse_Id <= 0) {
fprintf(stderr, "\n");
fprintf(stderr, "Error in Fg_getParameterIdByName(Device1_Process0_ByFactor8_SelectedPulse): %s (%d)\n", Fg_getLastErrorDescription(fg), Device1_Process0_ByFactor8_SelectedPulse_Id);
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
}
unsigned int Device1_Process0_ByFactor8_SelectedPulse;
Device1_Process0_ByFactor8_SelectedPulse = 1;
rc = Fg_setParameterWithType(fg, Device1_Process0_ByFactor8_SelectedPulse_Id, Device1_Process0_ByFactor8_SelectedPulse, 0);
if(rc < 0) {
fprintf(stderr, "\n");
fprintf(stderr, "Error in Fg_setParameterWithType(Device1_Process0_ByFactor8_SelectedPulse_Id): %s (%d)\n", Fg_getLastErrorDescription(fg), rc);
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
}
정보
자동 생성된 C++ Framegrabber API 코드에서 획득 중 매개변수 설정에 관련이 없는 모든 매개변수를 삭제할 수 있습니다. 획득 중에 구성해야 하는 매개변수만 유지하십시오.
- 디스플레이 생성, 획득 시작 및 이미지 취득:
// ---------------------------------------------------------------------------
// Frame Grabber: Create the display(s)
// ---------------------------------------------------------------------------
int id0 = CreateDisplay(8 * byteWidth0, width0, height0);
if(id0 < 0) {
fprintf(stderr, "Error in CreateDisplay(): %s (%d)\n", Fg_getLastErrorDescription(fg), id0);
Fg_FreeMemEx(fg, pmem0);
pmem0 = NULL;
Fg_FreeGrabber(fg);
fg = NULL;
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
return id0;
}
SetBufferWidth(id0, width0, height0);
// ---------------------------------------------------------------------------
// Frame Grabber: Start acquisition at applet and camera for each present port
// ---------------------------------------------------------------------------
rc = Fg_AcquireEx(fg, 0, nrOfCycles, ACQ_STANDARD, pmem0);
if(rc != 0) {
fprintf(stderr, "Error in Fg_AcquireEx() for channel 0: %s\n", Fg_getErrorDescription(fg, rc));
CloseDisplay(id0);
Fg_FreeMemEx(fg, pmem0);
pmem0 = NULL;
Fg_FreeGrabber(fg);
fg = NULL;
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
return rc;
}
// ---------------------------------------------------------------------------
// Frame Grabber: Grab images
// ---------------------------------------------------------------------------
frameindex_t frameNo0 = 0;
for(i = 1; i <= nrOfCycles; ++i){
frameNo0 = Fg_getLastPicNumberBlockingEx(fg, frameNo0 + 1, 0, 5, pmem0);
if(frameNo0 < 0) {
fprintf(stderr, "Error in Fg_getLastPicNumberBlockingEx(): %s (%d)\n", Fg_getLastErrorDescription(fg), frameNo0);
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
break;
} else {
fprintf(stderr, "grabbed image %d\n", frameNo0 );
}
void *iPtr0 = Fg_getImagePtrEx(fg, frameNo0, 0, pmem0);
if(iPtr0 == NULL) {
fprintf(stderr, "Error in Fg_getImagePtrEx(): %s\n", Fg_getLastErrorDescription(fg));
Fg_stopAcquireEx(fg, 0, pmem0, 0);
CloseDisplay(id0);
Fg_FreeMemEx(fg, pmem0);
pmem0 = NULL;
Fg_FreeGrabber(fg);
fg = NULL;
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
return -1;
}
DrawBuffer(id0, iPtr0, frameNo0, "");
}
- 획득 중지, 디스플레이 닫기, 버퍼용 메모리 해제:
// ---------------------------------------------------------------------------
// Frame Grabber: Stop acquisition
// ---------------------------------------------------------------------------
rc = Fg_stopAcquireEx(fg, 0, pmem0, 0);
if(rc < 0) {
fprintf(stderr, "Error in Fg_stopAcquireEx(): %s (%d)\n", Fg_getLastErrorDescription(fg), rc);
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
}
// ---------------------------------------------------------------------------
// Frame Grabber: Close the display
// ---------------------------------------------------------------------------
CloseDisplay(id0);
// ---------------------------------------------------------------------------
// Frame Grabber: Release the memory for buffer(s)
// ---------------------------------------------------------------------------
rc = Fg_FreeMemEx(fg, pmem0);
if(rc < 0) {
fprintf(stderr, "Error in Fg_FreeMemEx(): %s (%d)\n", Fg_getLastErrorDescription(fg), rc);
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
}
pmem0 = NULL;
// ---------------------------------------------------------------------------
// Frame Grabber: Uninitialization
// ---------------------------------------------------------------------------
rc = Fg_FreeGrabber(fg);
if(rc < 0) {
fprintf(stderr, "Error in Fg_FreeGrabber(): %s\n", Fg_getLastErrorDescription(NULL));
fprintf(stderr, "Press <Return> to continue...\n");
getchar();
}
fg = NULL;
fprintf(stderr, "Press <Return> to exit...\n");
getchar();
return (0);
}
이 예제 코드를 더 큰 SDK 환경에 통합할 수 있습니다.