콘텐츠로 건너뛰기

siso_genicam#

siso_genicam 라이브러리는 GenICam 표준을 준수하는 카메라 검색, 카메라 파라미터 액세스 및 카메라 명령 실행을 관리합니다. 이 문서 전체에서 파라미터와 명령을 기능(Feature)이라고 부릅니다.

라이브러리를 사용하려면 include 파일을 siso_genicam.h 소스 코드에 추가해야 합니다.

#include <siso_genicam.h>

추가로, siso_genicam.lib 을(를) Microsoft Visual Studio 프로젝트에 추가해야 합니다. 또는 libsiso_genicam.so Linux 프로젝트에 추가합니다. CMake를 사용하는 경우 패키지 이름은 SisoGenicam이며 라이브러리는 변수에 저장됩니다. ${SisoGenicam_LIBRARIES}. 프로젝트 및 CMake 사용 방법에 대한 자세한 내용은 사전 요구 사항 을(를) 참조하십시오.

이 라이브러리는 항상 프레임 그래버 라이브러리 fglib5와 함께 사용됩니다. 프로젝트에 fglib5 라이브러리를 추가하는 방법에 대한 자세한 내용은 The Frame Grabber Library fglib5를 참조하세요.

Camera Control Library에서의 Error Handling#

const char * Sgc_getErrorDescription(
    int result);

API의 대부분의 함수는 int 결과 코드를 반환합니다. 함수 호출이 성공적으로 실행되면 반환 값은 SGC_OK 또는 일부 함수의 경우 0과 같거나 큰 값입니다. 음수는 대부분의 경우 오류 상태를 나타냅니다. 오류 코드는 헤더 파일에 정의되어 있습니다. siso_genicam_error.h(파일에 자동으로 포함됨) siso_genicam.h.

함수 Sgc_getErrorDescription() 특정 결과 코드의 문자열 표현을 얻는 데 사용할 수 있습니다.

본 문서의 나머지 부분에 나오는 코드 예제에는 응용 프로그램의 요구 사항에 따라 달라지는 에러 처리가 포함되어 있지 않습니다. 가능한 한 함수가 성공적으로 실행되었는지 확인하기 위해 return codes을 확인합니다.

Camera Control Library 초기화#

int Sgc_initBoard(
    Fg_Struct * fg,
    unsigned int flags,
    SgcBoardHandle ** board);

void Sgc_freeBoard(
    SgcBoardHandle * board);

siso_genicam 라이브러리 작업을 시작하려면 먼저 에 설명된 대로 프레임 그래버를 초기화해야 합니다. The Frame Grabber Library fglib5. 다음으로 함수 Sgc_initBoard() 응용 프로그램이 사용하는 각 프레임 그래버에 대해 호출해야 합니다. 파라미터 flags 은(는) 향후 확장을 위해 예약되어 있으며 응용 프로그램은 항상 0을 전달해야 합니다. 초기화에 성공하면 보드 핸들이 매개변수에 전달된 변수에 저장됩니다. board.

siso_genicam 라이브러리를 사용하여 애플리케이션을 구현한 경우, 성공적으로 획득한 모든 보드 핸들은 다음 함수를 호출하여 해제해야 합니다. Sgc_freeBoard() 각각에 대해 수행합니다.

다음 예제는 라이브러리 사용을 시작하기 위해 보드 핸들을 가져오는 방법을 보여줍니다.

SgcBoardHandle * board = nullptr;
int result = Sgc_initBoard(fg, 0, &board);
if (result != SGC_OK) {
    // handle error ...
}

// use board, start discovery ...

Sgc_freeBoard(board);

카메라 검색(Discovery)#

int Sgc_scanPorts(
    SgcBoardHandle * board,
    unsigned int portMask,
    int timeout,
    int speed);

int Sgc_getCameraCount(
    SgcBoardHandle * board);

int Sgc_getCameraByIndex(
    SgcBoardHandle * board,
    unsigned int index,
    SgcCameraHandle ** camera);

int Sgc_getCamera(
    SgcBoardHandle * board,
    unsigned int port,
    SgcCameraHandle ** camera);

정보

Framegrabber API 버전 5.9에서는 함수의 동작이 Sgc_scanPorts() 그리고 해당 함수의 반환 값은 다음과 같습니다. Sgc_getCameraCount() 두 가지 모두 변경되었습니다.

애플리케이션에서 카메라를 사용하려면 먼저 카메라를 검색해야 합니다. 검색 절차에서는 프레임 그래버의 물리적 포트에서 연결 상태를 스캔합니다. 두 개 이상의 포트에서 연결이 감지되면, 다음 단계는 연결된 카메라의 수와 각 카메라가 사용하는 물리적 연결의 수를 파악하는 것입니다. 물리적 연결 및 전송 속도와 같은 해당 Property를 링크(Link)라고 합니다. 카메라는 하나 이상의 링크 구성을 지원합니다. 예를 들어 CoaXPress 카메라는 다양한 링크 구성을 지원할 수 있습니다. 예를 들어 4개의 물리적 포트가 있는 카메라는 CoaXPress 2.0 링크 속도의 하위 집합(3.125, 5, 6.25, 10, 12.5 Gbit/s)을 사용하여 1개, 2개 또는 4개의 링크를 사용하는 구성을 지원할 수 있습니다. 따라서 이 카메라는 총 15개의 서로 다른 링크 구성을 지원하게 됩니다.

카메라 검색 절차를 시작하려면 함수 Sgc_scanPorts() 함수를 호출해야 합니다. 이 함수는 이전 호출에서 얻은 보드 핸들을 요구합니다. Sgc_initBoard() 매개변수 내 board, 매개변수에서 검색을 수행할 물리적 포트를 지정하는 비트 마스크 portMask 그리고 매개변수에서 적어도 하나의 카메라가 검색될 때까지 대기할 시간을 밀리초 단위로 지정합니다. timeout. 파라미터 speed 이(가) 되어야 합니다. LINK_SPEED_NONE 대부분의 경우에 해당합니다. 선택적으로 카메라가 검색될 것으로 예상되는 링크 속도에 대한 힌트를 검색 과정에 제공하는 데 사용할 수 있습니다.

하나 이상의 프레임 그래버에 대해 단일 프로세스를 사용하는 응용 프로그램에서는 포트 마스크가 항상 0xf. 이 방식을 통해 프레임 그래버의 모든 포트에서 카메라를 스캔합니다. 애플리케이션이 프레임 그래버에 여러 프로세스를 사용하는 경우 다음 장을 읽어보세요. 여러 프로세스에서의 카메라 검색(Discovery) 지원.

카메라가 검색된 후, 사용된 애플릿과 카메라 기본 설정에 따라 최종 링크 구성이 협상됩니다. 검색된 카메라가 응용 프로그램에 표시되는 상태를 이해하려면 이 프로세스의 한계를 아는 것이 유용합니다. 검색 알고리즘은 카메라가 제공하는 GenICam XML을 사용하지 않습니다. 대신 카메라 기본 설정에 따라 카메라 검색 절차에서 사용할 수 있는 최대 링크 속도와 링크 수가 결정됩니다. 일부 카메라의 경우 기본 설정이 카메라가 사용할 수 있는 가장 높은 링크 속도나 최대 링크 수가 아닐 수도 있습니다! 반면 애플릿 레이아웃은 애플릿의 검색 절차에서 사용할 수 있는 최대 카메라 수와 각 카메라의 최대 링크 수를 결정합니다. 검색 알고리즘은 한편으로는 발견된 카메라와 다른 한편으로는 애플릿 레이아웃을 가장 잘 일치시키려고 시도합니다. 카메라 설정 및 사용하려는 기능에 가장 잘 맞는 애플릿을 찾으려면 애플릿 설명서와 카메라 설명서를 참조하십시오.

(또한 앱릿 레이아웃을 보여주는 다이어그램은 이미지 데이터 흐름 이해 장을 참조하세요. 프레임 그래버에 연결된 각 카메라에 대해 앱릿에는 해당 카메라 오퍼레이터가 필요합니다. 카메라 오퍼레이터의 수는 각 앱릿의 고정된 Property입니다. 프레임 그래버에 연결된 카메라에 사용할 앱릿을 선택하는 방법을 이해하려면 The Frame Grabber Library fglib5 파트의 프레임 그래버 초기화 장 끝에 있는 주석도 검토하는 것이 좋습니다.)

호출 시 Sgc_scanPorts() 반환 값: SGC_OK, 지정된 시간 내에 하나 이상의 카메라가 발견되었으며 애플릿과 카메라가 성공적으로 매칭되었음을 의미합니다. 반환 값이 다음과 같은 경우 ERR_SGC_TOPOLOGY_MISMATCH, 적어도 하나의 카메라는 발견되었으나 앱과 카메라가 일치하지 않아 카메라와의 통신은 여전히 가능하지만 카메라에서 앱으로 이미지 데이터를 올바르게 전송할 수 없습니다.

다음에 대한 성공적인 호출 이후 Sgc_scanPorts(), 함수 Sgc_getCameraCount() 을(를) 호출하여 발견된 카메라 수를 요청하고 다음 중 하나를 사용할 수 있습니다. Sgc_getCameraByIndex() 또는 Sgc_getCamera() camera handle을 얻기 위해 사용합니다. 두 함수는 유사한 방식으로 작동하며 세 개의 매개변수를 요구합니다. 첫 번째 매개변수는 보드 핸들입니다. Sgc_getCameraByIndex(), 두 번째 파라미터는 0부터 보고된 카메라 수 사이의 번호로 카메라를 식별합니다. Sgc_getCameraCount() 에서 1을 뺀 값입니다. 따라서 이 함수를 사용하여 발견된 모든 카메라를 편리하게 반복 처리할 수 있지만, 카메라가 발견되는 순서 및 그에 따른 인덱스는 다음과 같은 두 번의 호출 사이에서 변경될 수 있습니다. Sgc_scanPorts(). 대상: Sgc_getCamera(), 두 번째 매개변수는 카메라가 연결된 물리적 포트를 통해 카메라를 식별합니다. 물리적 포트는 0부터 사용 중인 프레임 그래버의 물리적 포트 수에서 1을 뺀 값까지 번호가 지정됩니다. 항상 동일한 물리적 케이블링을 사용하는 경우, 이 함수를 사용하여 다음에서 언급된 모호성을 피할 수 있습니다. Sgc_getCameraByIndex(). 세 번째 파라미터는 카메라 핸들을 저장할 변수에 대한 포인터입니다.

다음 예제는 최대 10초 동안 카메라를 검색한 후 해당하는 camera handle을 가져오는 방법을 보여줍니다.

const unsigned int portMask = 0xf;
const int timeoutInMs = 10000;

int result = Sgc_scanPorts(board, portMask, timeoutInMs, LINK_SPEED_NONE);
if (result != SGC_OK) {
    // handle error ...
}

SgcCameraHandle * camera = nullptr;
result = Sgc_getCameraByIndex(board, index, &camera);
if (result == SGC_OK) {
        // use camera ...
}

위의 예제에 설명된 간단한 접근 방식은 단일 카메라 설정에서만 작동합니다.

둘 이상의 카메라로 작업하는 애플리케이션의 경우, 검색(Discovery)을 처리하는 권장 방법은 다음장에서 설명하는 대로 콜백 함수를 등록하는 것입니다. 검색(Discovery) 이벤트용 콜백 함수 등록, 그런 다음 호출합니다. Sgc_scanPorts() 검색 프로세스를 시작하려면 0의 타임아웃을 지정합니다. 콜백 핸들러 내에서 응용 프로그램은 예를 들어 새 카메라도 발견될 때 별도의 취득 스레드를 시작할 수 있습니다.

또는 애플리케이션에서 다음을 호출할 수 있습니다. Sgc_scanPorts() 예상되는 모든 카메라가 발견될 때까지 반복합니다. 다음 예제는 처리를 계속하기 전에 4대의 카메라가 발견되기를 기다립니다.

const unsigned int portMask = 0xf;
const int timeoutInSeconds = 10;
const int numberOfCamerasExpected = 4;

int result = SGC_OK;
int numberOfCamerasFound = 0;
auto start = std::chrono::steady_clock::now();
do {
    result = Sgc_scanPorts(board, portMask, 1000, LINK_SPEED_NONE);
    if (result == SGC_OK) {
        numberOfCamerasFound = Sgc_getCameraCount(board);
    }
} while ((numberOfCamerasFound < numberOfCamerasExpected) && (std::chrono::steady_clock::now() - start < std::chrono::seconds(timeoutInSeconds)));
if (numberOfCamerasFound < numberOfCamerasExpected) {
    // handle error ...
}

// use cameras ...

카메라 검색(Discovery) 재시작#

int Sgc_scanPortsEx(
    SgcBoardHandle * board,
    unsigned int portMask,
    int timeout,
    int speed,
    unsigned int flags);

정보

함수의 기본 동작 Sgc_scanPortsEx() Framegrabber API 버전 5.9에서 변경되었습니다.

함수 Sgc_scanPorts() 및 Sgc_scanPortsEx() 파라미터에 0을 전달하여 호출할 때 flags 둘 다 검색 절차를 수행하는 백그라운드 스레드를 시작한 다음 해당 스레드와 동기화하여 호출에 지정된 시간 동안 카메라가 발견되었는지 확인합니다. 이후에 함수를 호출하면 카메라 확인을 위한 동기화만 수행됩니다. 카메라 검색 절차를 완전히 다시 시작하려면, Sgc_scanPortsEx() 다음과 함께 호출 SGC_SP_FLAG_RESET_DISCOVERY_INFOS 매개변수 내 flags.

카메라 Property 작업#

카메라가 검색되면 응용 프로그램은 카메라 기능 사용을 시작할 수 있습니다. 이러한 기능, 즉 카메라 파라미터와 커맨드는 표준화된 기능 인터페이스를 통해 카메라에서 다운로드할 수 있는 XML 문서에 정의되어 있거나, 카메라 제조업체에서 제공하는 기타 방식(예: 일부 카메라 제조업체에서 XML 문서를 다운로드할 수 있는 웹사이트를 제공할 수 있음)으로 정의됩니다. XML 문서의 구조는 GenICam 표준에 정의되어 있습니다. GenICam에 대해 자세히 알아보려면 유럽 머신비전 협회(European Machine Vision Association)의 GenICam 웹사이트를 방문하십시오. 카메라가 제공하는 기능에 대한 자세한 내용은 카메라 문서를 참조하십시오.

또한 GenICam 표준은 GenApi를 통해 카메라 기능을 제어하는 방법을 정의합니다. Using the GenICam Reference Implementation 장에서는 siso_genicam 라이브러리를 GenApi와 연결하는 방법을 다룹니다.

이 장에서는 GenApi를 보다 쉽게 사용할 수 있도록 래핑하여 Framegrabber API에서 직접 카메라 기능을 사용할 수 있게 해주는 일련의 함수를 설명합니다. 설명된 API를 사용하여 알려진 기능을 위해 카메라 파라미터를 가져오고 설정하며 명령어를 실행할 수 있지만, XML의 고급 기능은 지원되지 않으며 응용 프로그램에서 GenApi를 사용해야 합니다.

카메라 연결#

int Sgc_connectCamera(
    SgcCameraHandle * camera);

int Sgc_connectCameraWithExternalXml(
    SgcCameraHandle * cameraHandle,
    const char * file);

int Sgc_disconnectCamera(
    SgcCameraHandle * camera);

검색 절차에서는 발견된 카메라와의 물리적 연결이 설정되었습니다. 카메라 기능을 사용하려면 논리적 연결을 설정해야 합니다. 이 논리적 연결은 GenICam XML을 읽고 Framegrabber SDK에서 내부적으로 사용하는 GenApi 환경을 준비하여 설정됩니다. 카메라가 제공한 XML을 사용하여 논리적 연결을 설정하려면 다음 함수를 사용합니다. Sgc_connectCamera() 을(를) 호출해야 합니다. 제조업체 웹사이트에서 다운로드했거나 기타 수단으로 획득한 XML 파일을 사용해야 하는 경우, 함수는 Sgc_connectCameraWithExternalXml() 을 사용할 수 있습니다. 두 함수 모두 추가로 매개변수에서 camera handle을 요구합니다. camera. 이 함수는 Sgc_connectCameraWithExternalXml() 파라미터에서 XML 파일의 경로를 예상합니다. file 를 요구합니다.

응용 프로그램이 카메라 기능 사용을 완료하면 다음을 호출하여 논리적 연결을 닫을 수 있습니다. Sgc_disconnectCamera().

카메라 Property 가져오기 및 설정#

int Sgc_getIntegerValue(
    SgcCameraHandle * camera,
    const char * feature,
    int64_t * value);

int Sgc_getBooleanValue(
    SgcCameraHandle * camera,
    const char * feature,
    unsigned int * value);

int Sgc_getFloatValue(
    SgcCameraHandle * camera,
    const char * feature,
    double * value);

int Sgc_getStringValue(
    SgcCameraHandle * camera,
    const char * feature,
    const char ** value);

int Sgc_getEnumerationValue(
    SgcCameraHandle * camera,
    const char * feature,
    int64_t * value);

int Sgc_getEnumerationValueAsString(
    SgcCameraHandle * camera,
    const char * feature,
    const char ** value);

int Sgc_clearStringCache(
    SgcCameraHandle * camera);
int Sgc_setIntegerValue(
    SgcCameraHandle * camera,
    const char * feature,
    int64_t value);

int Sgc_setBooleanValue(
    SgcCameraHandle * camera,
    const char * feature,
    unsigned int value);

int Sgc_setFloatValue(
    SgcCameraHandle * camera,
    const char * feature,
    double value);

int Sgc_setStringValue(
    SgcCameraHandle * camera,
    const char * feature,
    const char * value);

int Sgc_setEnumerationValue(
    SgcCameraHandle * camera,
    const char * feature,
    const char * value);

숫자 표현 형식을 가진 카메라 파라미터의 값을 요청하려면 다음 함수를 사용합니다. Sgc_getIntegerValue(), Sgc_getBooleanValue(), Sgc_getFloatValue() 및 Sgc_getEnumerationValue() 을(를) 사용할 수 있습니다. 이러한 함수는 파라미터에서 카메라 핸들을 예상합니다. camera, 매개변수에서 기능 이름(feature name)을 지정합니다. feature 그리고 값이 저장될 해당 형식의 변수에 대한 포인터는 파라미터에 있습니다. value.

문자열 표현으로 카메라 파라미터 값을 요청하는 함수는 Sgc_getStringValue() 및 Sgc_getEnumerationValueAsString(), 형식의 변수에 대한 포인터를 예상합니다. char * 매개변수 내 value. 이 변수에는 문자열 값에 대한 포인터가 저장됩니다.

문자열 값은 내부 캐시에 할당되어 저장됩니다. 캐시는 응용 프로그램이 문자열 값을 요청할 때마다 증가하며 캐시에서 단일 문자열 값을 직접 해제할 방법은 없습니다. 그러나 다음을 호출하여 캐시를 지울 수 있습니다. Sgc_clearStringCache(). 이렇게 하면 이전에 할당된 모든 문자열 값이 해제되고 유효하지 않게 됩니다.

값을 설정하려면 다음 함수를 사용합니다. Sgc_setIntegerValue(), Sgc_setBooleanValue(), Sgc_setFloatValue(), Sgc_setStringValue() 및 Sgc_setEnumerationValue() 호출할 수 있습니다. 이러한 함수는 파라미터에서 카메라 핸들을 필요로 합니다. camera, 매개변수에서 기능 이름(feature name)을 지정합니다. feature 그리고 파라미터의 값 value.

다음 예제는 카메라 XML로 카메라를 연결하고 전송할 이미지의 너비와 높이를 설정하는 방법을 보여줍니다.

int result = Sgc_connectCamera(camera);
if (result == SGC_OK) {
    result = Sgc_setIntegerValue(camera, "Width", 1920);
}
if (result == SGC_OK) {
    result = Sgc_setIntegerValue(camera, "Height", 1080);
}

카메라 명령 실행#

int Sgc_executeCommand(
    SgcCameraHandle * camera,
    const char* feature);

int Sgc_isCommandDone(
    SgcCameraHandle * camera,
    const char* feature,
    unsigned int * value);
int Sgc_startAcquisition(
    SgcCameraHandle * camera,
    unsigned int start);

int Sgc_stopAcquisition(
    SgcCameraHandle * camera,
    unsigned int stop);

명령어를 실행하려면 다음 함수를 사용합니다. Sgc_executeCommand() 호출할 수 있습니다. 이 함수는 파라미터에서 카메라 핸들을 필요로 합니다. camera 그리고 파라미터의 기능 이름 feature. 이 함수는 Sgc_isCommandDone() 명령 실행이 완료되었는지 확인하는 데 사용할 수 있습니다. 파라미터에서 카메라 핸들을 필요로 합니다. camera, 매개변수에서 기능 이름(feature name)을 지정합니다. feature 그리고 형식의 변수에 대한 포인터 unsigned int 매개변수 내 value. 명령 실행이 완료된 경우 변수에 값 1이 저장되고, 명령이 여전히 실행 중인 경우 값 0이 저장됩니다.

함수 Sgc_startAcquisition() 및 Sgc_stopAcquisition() 은(는) 표준 기능에 대한 단축키입니다. AcquisitionStart 및 AcquisitionStop. 이 함수는 파라미터가 다음과 같을 때만 실행됩니다. start 또는 stop 결과로 나타납니다. true:

int Sgc_startAcquisition(SgcCameraHandle * camera, unsigned int start)
{
    int result = SGC_OK;
    if (start) {
        result = Sgc_executeCommand(camera, "AcquisitionStart");
    }
    return result;
}

카메라 정보#

int Sgc_getCameraPropertyWithType(
    SgcCameraHandle * camera,
    const char * property,
    void * value,
    unsigned int * type,
    void * additionalValue);

int Sgc_updateCameraInfos(
    SgcCameraHandle * camera);

정보

Framegrabber API 버전 5.9에서 함수의 기능을 통해 사용할 수 있는 정보가 Sgc_getCameraPropertyWithType() 확장되었으며 해당 함수는 Sgc_updateCameraInfos() 추가되었습니다.

검색 절차에서 카메라와의 물리적 연결이 설정된 후, 카메라 및 연결에 대한 다양한 정보를 요청하여 확인할 수 있습니다.

함수 Sgc_getCameraPropertyWithType() 카메라 연결에 대한 정보를 요청하기 위해 호출할 수 있습니다. 이 함수는 파라미터에서 카메라 핸들을 필요로 합니다. camera, 매개변수의 connection Property, property, 값이 저장될 변수에 대한 포인터, 그리고 다음 형식의 변수에 대한 포인터 unsigned int 이는 Property의 유형을 반영하도록 초기화되어야 합니다. 파라미터 additionalValue 은(는) 아래에 문서화된 대로 일부 Property에 필요합니다.

Property 설명 Type
CAM_PROP_MASTERID 카메라의 Master IDa uint32_t
CAM_PROP_NROFLINKS 이미지 전송에 사용되는 물리적 링크 수 uint32_t
CAM_PROP_LINKSPEED 현재 링크 속도(Mbit/s) uint32_t
CAM_PROP_DISCOVERYSPEED 카메라가 검색된 링크 속도(Mbit/s) uint32_t
CAM_PROP_FGPORT 링크가 연결된 물리적 포트(additionalValue: 링크 인덱스) uint32_t
CAM_PROP_MASTERPORT 마스터 링크가 연결된 물리적 포트(링크 0의 경우 FGPORT와 동일) uint32_t
CAM_PROP_APPLETMASTERID 애플릿 카메라 포트의 Master IDa uint32_t
CAM_PROP_APPLETOPERATORINDEX 애플릿 카메라 오퍼레이터의 인덱스 uint32_t
CAM_PROP_APPLETOPERATORSIZE 애플릿 카메라 오퍼레이터의 링크 수 uint32_t
CAM_PROP_APPLETPORT 링크가 연결된 논리적 포트(additionalValue: 링크 인덱스) uint32_t
CAM_PROP_CONTROLPACKETSIZE 제어 패킷의 최대 크기 uint32_t
CAM_PROP_STREAMPACKETSIZE 스트림 패킷의 최대 크기 uint32_t
CAM_PROP_ISCONNECTED 0: 물리적 연결 없음
1: 물리적 연결됨
uint32_t
CAM_PROP_ISGENICAMCONNECTED 0: 논리적 연결 없음
1: 논리적 연결됨
uint32_t
CAM_PROP_ISTRANSCEIVERLOCKED 0: 전송 오류가 너무 많음
1: 전송이 안정적임
uint32_t
CAM_PROP_XML_DATA 널 종료 문자열 형태의 카메라 XML data (additionalValue: 버퍼 크기) char *
CAM_PROP_VENDOR_NAME 널 종료 문자열 형태의 카메라 공급업체 이름 (additionalValue: 버퍼 크기) char *
CAM_PROP_MODEL_NAME 널 종료 문자열 형태의 카메라 모델 이름 (additionalValue: 버퍼 크기) char *
CAM_PROP_FAMILY_NAME 널 종료 문자열 형태의 카메라 패밀리 이름 (additionalValue: 버퍼 크기) char *
CAM_PROP_VERSION 널 종료 문자열 형태의 카메라 버전 (additionalValue: 버퍼 크기) char *
CAM_PROP_FIRMWARE_VERSION 널 종료 문자열 형태의 카메라 펌웨어 버전 (additionalValue: 버퍼 크기) char *
CAM_PROP_MANUFACTURER_INFO 널 종료 문자열 형태의 카메라 제조사 정보 (additionalValue: 버퍼 크기) char *
CAM_PROP_SERIAL_NUMBER 널 종료 문자열 형태의 카메라 일련번호 (additionalValue: 버퍼 크기) char *
CAM_PROP_USER_ID 널 종결 문자열 형태의 카메라 User ID (additionalValue: 버퍼 크기) char *

위의 목록은 완전하지 않으며 응용 프로그램에 유용한 정보에 대한 Property만 포함하고 있습니다. API의 더 많은 사용 사례는 Framegrabber API 레퍼런스를 참조하세요.

Property에서 매개변수를 사용하는 경우, additionalValue 링크 인덱스의 경우, 다음과 같은 경우 기본 링크 인덱스는 0입니다. nullptr 전달됩니다. additionalValue 호출 시. 링크 인덱스 0은 카메라의 마스터 링크입니다.

해당 유형의 값을 요청하려면 다음 값을 사용해야 합니다.

Property Type C/C++ 타입
SGC_PROPERTY_TYPE_UINT uint32_t
SGC_PROPERTY_TYPE_DOUBLE double
SGC_PROPERTY_TYPE_STRING char *

다음 예제는 카메라가 연결된 속도와 링크 수를 가져오는 방법을 보여줍니다.

unsigned int numberOfLinks = 0;
unsigned int linkSpeed = 0;
int type = SGC_PROPERTY_TYPE_UINT;
int result =
    Sgc_getCameraPropertyWithType(camera, CAM_PROP_NROFLINKS,
                                  &linkSpeed, &type, nullptr);
if (result == SGC_OK) {
    result =
        Sgc_getCameraPropertyWithType(camera, CAM_PROP_LINKSPEED,
                                      &numberOfLinks, &type, nullptr);
}
if (result == SGC_OK) {
    std::cout << "Link configuration: " << numberOfLinks
              << " x " << (1e-3 * linkSpeed)
              << " Gbit/s" << std::endl;
}

다음 유형의 Property를 요청하려면 SGC_PROPERTY_TYPE_STRING, 다음 함수를 두 번 호출하여 Sgc_getCameraPropertyWithType() 필요합니다. 파라미터에 nullptr 전달 value 그리고 형식의 변수에 대한 포인터 unsigned int 파라미터에 additionalValue, 널 문자를 포함하여 문자열에 필요한 버퍼 크기 \0 문자를 요청할 수 있으며 변수에 저장됩니다. 두 번째 호출에서는 할당된 버퍼에 대한 포인터가 파라미터로 전달됩니다. value 매개변수의 크기 변수에 대한 포인터와 함께 additionalValue. 필요한 것보다 더 많은 공간으로 버퍼가 할당된 경우, 반환 시 버퍼 크기 변수에는 종료 문자를 포함한 데이터의 길이가 포함됩니다. \0 문자입니다.

다음 예제에서는 다음을 사용하여 디바이스 모델 이름을 요청하는 방법을 보여줍니다. Sgc_getCameraPropertyWithType(): (이 예제에는 다음 C++ 헤더 파일이 필요합니다. memory 대상 std::unique_ptr 형식)

// get size of model name
unsigned int size = 0;
unsigned int propertyType = SGC_PROPERTY_TYPE_STRING;
result =
    Sgc_getCameraPropertyWithType(camera, CAM_PROP_MODEL_NAME,
                                  nullptr, &propertyType, &size);
if (result == SGC_OK && size > 0) {
    // create buffer and request camera model name
    std::unique_ptr<char[]> modelName(new char[size]);
    result =
        Sgc_getCameraPropertyWithType(camera, CAM_PROP_MODEL_NAME,
                                      modelName.get(), &propertyType, &size);
    if (result == SGC_OK) {
        std::cout << "Camera model name: " << modelName.get() << std::endl;
    }
}

애플리케이션이 다음을 통해 사용 가능한 정보의 변경을 수반하는 카메라 기능을 사용하는 경우 Sgc_getCameraPropertyWithType()예를 들어 사용자 ID 문자열을 설정하거나 카메라 펌웨어 버전을 업데이트할 때, 함수 Sgc_updateCameraInfos() Framegrabber API의 데이터 업데이트를 요청하기 위해 호출해야 합니다.

이미지 데이터 흐름 이해#

카메라에서 프레임 그래버의 Applet을 거쳐 애플리케이션 memory로 이미지 데이터가 흐르는 방식을 이해하기 위해, 먼저 두 대의 카메라가 Applet 내의 해당 카메라 오퍼레이터에 직관적인 방식으로 연결된 간단한 설정을 살펴보겠습니다.

Data Flow Straight

예제의 앱렛은 다음과 같을 수 있습니다. Acq_DualCXP12Area또는 이와 유사한 Applet이 필요합니다. 카메라 인덱스가 0이고 Master ID가 1인 카메라의 이미지 데이터는 프레임 그래버의 물리적 포트 0과 1을 거쳐 오퍼레이터 인덱스가 0이고 Master ID가 1인 카메라 오퍼레이터로 흐른 후, Applet 전용 이미지 파이프라인에서 처리되어 인덱스가 0인 DMA 오퍼레이터를 통해 애플리케이션 memory로 전송됩니다. (Master ID는 카메라나 오퍼레이터가 연결된 포트를 기반으로 하므로, 두 번째 카메라와 오퍼레이터의 Master ID는 2가 아니라 3입니다. 인덱스는 1입니다.)

애플리케이션 관점에서 중요한 정보는 카메라의 이미지 데이터가 어떤 DMA 채널에서 전송될지 여부입니다. 예제의 앱렛 레이아웃의 경우 카메라의 단일 Property인, CAM_PROP_APPLETOPERATORINDEX, 올바른 DMA 채널을 파악하는 데 필요합니다. Framegrabber SDK 설치에 포함된 모든 Applet은 이 원칙에 따라 설계되었습니다. VisualApplets로 설계된 Applet의 경우에도 유사한 방식을 채택하고 레이아웃을 문서화하는 것이 강력히 권장됩니다.

케이블이 교차 연결된 보다 복잡한 예시를 살펴보겠습니다.

Data Flow Crossed

이미지 전송이 정상적으로 작동하려면 검색 절차를 통해 위 다이어그램에 표시된 것처럼 프레임 그래버의 물리적 포트를 카메라 오퍼레이터의 논리적 포트에 연결해야 합니다. (다이어그램을 보면 마스터 ID가 2인 카메라가 마스터 ID가 0인 카메라 오퍼레이터에 연결되는 두 번째 가능성도 있습니다. 이는 검색 절차가 처음 실행될 때 카메라가 하나만 연결되어 있었고 두 번째 카메라는 나중에 추가된 경우에 발생할 수 있습니다.)

그럼에도 불구하고 동일한 카메라 Property인 CAM_PROP_APPLETOPERATORINDEX, 올바른 DMA 채널을 파악하는 데 충분합니다.

검색(Discovery) 이벤트용 콜백 함수 등록#

struct SgcEventInfo {
  uint16_t eventID;
  union SgcEventData data;
}

typedef int (* Sgc_BoardEventCallbackFunc_t)(
    SgcBoardHandle * board,
    const struct SgcEventInfo * info,
    void * data);

int Sgc_registerBoardEventCallback(
    SgcBoardHandle * board,
    Sgc_BoardEventCallbackFunc_t func,
    void * data);
int Sgc_scanPortsEx(
    SgcBoardHandle * board,
    unsigned int portMask,
    int timeout,
    int speed,
    unsigned int flags);

정보

함수 Sgc_registerBoardEventCallback() Framegrabber API 버전 5.9에 추가되었습니다.

사용 Sgc_registerBoardEventCallback(), 다음 유형의 함수 SgcEventCallback_t 라이브러리에서 이벤트가 생성될 때 콜백되도록 등록할 수 있습니다. 이 함수는 지정된 보드 핸들에 대해 등록되며 호출 시 세 개의 파라미터가 전달됩니다. 콜백 함수의 첫 번째 파라미터는 보드 핸들입니다. 두 번째 파라미터는 다음 항목에 대한 포인터입니다. struct SgcEventInfo 이벤트에 대한 정보를 저장하는 데 사용됩니다. 마지막 매개변수는 다음 호출과 함께 제공된 포인터입니다. Sgc_registerBoardEventCallback() 그리고 컨텍스트 구조체나 클래스에 대한 포인터로 사용할 수 있습니다. 예: this 이미지 처리를 구현하는 클래스 인스턴스의 포인터입니다.

각 보드 핸들에는 하나의 콜백 함수만 등록할 수 있습니다.

카메라에 대한 검색 정보는 다음 함수가 호출될 때만 업데이트됩니다. Sgc_scanPorts() 또는 Sgc_scanPortsEx() 가 호출됩니다. 정보를 업데이트만 하려면, Sgc_scanPortsEx() 다음과 같이 사용하여 콜백 함수에서 호출할 수 있습니다. SGC_SP_FLAG_UPDATE_DISCOVERY_INFOS_ONLY 매개변수 내 flags.

콜백 함수가 더 이상 필요하지 않게 되면 다음을 호출하여 등록을 해제할 수 있습니다. Sgc_registerBoardEventCallback(), 전달하는 nullptr 파라미터에 func 및 data.

이 struct SgcEventInfo 인스턴스에는 멤버의 이벤트 식별자가 포함됩니다. eventID 그리고 union 멤버의 추가 데이터 data. 라이브러리에서 생성되는 이벤트에는 다음과 같은 이벤트 식별자가 사용됩니다.

Event 설명
SGC_EVENT_DISCOVERY_STATE_CAMERA_ADDED 새로운 카메라가 검색되었습니다.
SGC_EVENT_DISCOVERY_STATE_CAMERA_LOST 카메라와의 연결이 끊어졌습니다.
SGC_EVENT_DISCOVERY_STATE_CAMERA_PROPERTY_CHANGE 카메라 연결 Property가 변경되었습니다.

다음 예제는 애플리케이션에 유용한 정보를 담을 수 있는 간단한 구조체를 사용하여 콜백 함수를 등록하는 방법을 보여줍니다.

struct DiscoveryUserCallbackData
{
    // ...
};

int DiscoveryUserCallback(SgcBoardHandle * board,
                          const struct SgcEventInfo * info, void * data)
{
    auto context = reinterpret_cast<DiscoveryUserCallbackData *>(data);

    // update discovery infos
    Sgc_scanPortsEx(board, 0xf, 0, LINK_SPEED_NONE,
                    SGC_SP_FLAG_UPDATE_DISCOVERY_INFOS_ONLY);

    // process event ...

    return 0;
}

void SetupDiscoveryUserCallback(SgcBoardHandle * board,
                                DiscoveryUserCallbackData * context)
{
    // register callback function
    int result =
        Sgc_registerBoardEventCallback(board, &DiscoveryUserCallback, context);
    if (result != SGC_OK) {
        throw std::runtime_error("Failed to register callback function");
    }
}

컨텍스트 구조의 할당 및 관리는 예제에 표시되지 않습니다. 포인터는 콜백 함수가 등록되어 있는 동안 유효해야 합니다. 한 가지 해결책은 C++ 클래스 내에서 모든 것을 함께 유지하는 것입니다. C++ 클래스 컨텍스트에서 콜백 함수를 사용하려면 정적 함수를 사용하여 콜백 핸들러를 등록할 수 있으며, this 포인터는 컨텍스트 데이터 포인터로 사용되어야 하며, 이를 다시 클래스 포인터로 캐스팅하여 그에 따라 사용할 수 있습니다.

검색(Discovery) 상태 변경 정보#

struct SgcEventData_DiscoveryStateChanged {
    uint32_t id;
    uint32_t properties_int_count;
    char ** properties_int_key;
    uint32_t * properties_int_value;
    uint32_t properties_string_count;
    char ** properties_string_key;
    char ** properties_string_value;
};

정보

카메라 탐색 상태 변경 이벤트는 Framegrabber API 버전 5.9에 추가되었습니다.

보드 이벤트의 경우, struct SgcEventData_DiscoveryStateChanged 은 이벤트의 영향을 받는 카메라 연결에 대한 정보를 제공하는 데 사용됩니다. 이 구조체는 다음 멤버에 카메라 마스터 ID를 포함합니다. id 그리고 두 개의 키-값 맵(정수 값용 하나와 문자열 값용 하나)이 있습니다. 키는 다음을 통해 사용할 수 있는 Property와 동일합니다. Sgc_getCameraPropertyWithType(), 하지만 이벤트 및 카메라 인터페이스 기술에 따라 모든 Property가 이벤트 정보에 포함되는 것은 아닙니다. 애플리케이션은 이벤트가 생성된 변경 사항과 관련된 Property가 맵에 포함되어 있을 것으로 예상할 수 있습니다. 이외에 애플리케이션은 Property의 존재 여부나 맵 내 Property의 순서에 대해 가정해서는 안 됩니다.

구조체의 모든 데이터는 이벤트 콜백 함수 내에서만 유효합니다. 정보를 유지해야 하는 경우 관련 부분을 복사해야 합니다.

다음 예제는 다음에서 링크 속도와 링크 수를 추출하는 방법을 보여줍니다. SGC_EVENT_DISCOVERY_STATE_CAMERA_PROPERTY_CHANGE 이벤트:

int DiscoveryUserCallback(SgcBoardHandle * board,
                          const struct SgcEventInfo * info, void * data)
{
    auto context = reinterpret_cast<DiscoveryUserCallbackData *>(data);

    // update discovery infos
    Sgc_scanPortsEx(board, 0xf, 0, LINK_SPEED_NONE,
                    SGC_SP_FLAG_UPDATE_DISCOVERY_INFOS_ONLY);

    // process event ...
    if (info->eventID == SGC_EVENT_DISCOVERY_STATE_CAMERA_PROPERTY_CHANGE) {
        int newNumOfLinks = 0;
        int newLinkSpeed = LINK_SPEED_NONE;
        for (int i = 0; i < info->data.discovery_state.properties_int_count; ++i) {
            if (strcmp(info->data.discovery_state.properties_int_keys[i],
                       CAM_PROP_NROFLINKS) == 0) {
                newNumOfLinks = info->data.discovery_state.properties_int_values[i];
            }
            if (strcmp(info->data.discovery_state.properties_int_keys[i],
                       CAM_PROP_LINKSPEED) == 0) {
                newLinkSpeed = info->data.discovery_state.properties_int_values[i];
            }
        }

        // ...
    }

    return 0;
}

GenICam 참조 구현 사용#

GenICam 참조 구현을 사용하는 것은 카메라 Property 작업장에서 설명하는 Framegrabber API 제공 GenApi 래퍼를 사용하는 것의 대안입니다. 애플리케이션이 GenICam 참조 구현을 사용하는 경우, Sgc_connectCamera() 또는 Sgc_connectCameraWithExternalXml() 호출해서는 안 됩니다. 대신 애플리케이션에 GenApi 헤더 파일을 포함해야 합니다. GenICam.h, GenICam 라이브러리에 링크 GCBase 및 GenApi 그리고 해당 GenApi 컨텍스트를 초기화합니다.

#include <GenICam.h>

Framegrabber SDK 설치에 포함된 GenICam 레퍼런스 구현을 사용하려면 다음 단계를 수행해야 합니다.

  • Windows에서 64비트 Framegrabber SDK를 사용하는 경우:
  • 추가 %BASLER_FG_SDK_DIR%\bin 시스템 환경 변수에 PATH
  • 추가 %BASLER_FG_SDK_DIR%\include 프로젝트 include 디렉터리에
  • 추가 %BASLER_FG_SDK_DIR%\library\visualc 프로젝트 라이브러리 디렉토리에
  • 라이브러리 추가 GCBase_MD_VC141_v3_1_Basler_pylon_v3.lib 및 GenApi_MD_VC141_v3_1_Basler_pylon_v3.lib 프로젝트 링크 라이브러리에
  • 애플리케이션이 Linux에서 64비트 Framegrabber SDK를 사용하는 경우:
  • 추가 $BASLER_FG_SDK_DIR\lib64 시스템 환경 변수에 LD_LIBRARY_PATH 그리고 프로젝트 라이브러리 디렉토리에
  • 추가 $BASLER_FG_SDK_DIR\include 프로젝트 include 디렉터리에
  • 라이브러리 추가 libGCBase_gcc_v3_1_Basler_pylon_v3.so 및 libGenApi_gcc_v3_1_Basler_pylon_v3.so 프로젝트 링크 라이브러리에
  • 추가 #define GENICAM_NO_AUTO_IMPLIB 이전 #include <GenICam.h>

CMake를 사용하여 프로젝트 파일을 생성하는 경우, 패키지 SisoGenicam은 Framegrabber SDK 설치와 함께 제공되는 GenICam 라이브러리도 검색하여 다음 변수에 포함합니다. ${SisoGenicam_LIBRARIES}. GenICam include 경로는 변수에 저장됩니다. ${GENICAM_INCLUDE_DIR} 여기에 추가되어야 합니다. INCLUDE_DIRECTORIES.

IPort 래퍼 생성#

int Sgc_memoryReadFromCamera(
    SgcCameraHandle * camera,
    void * buffer,
    uint64_t address,
    size_t length);

int Sgc_memoryWriteToCamera(
    SgcCameraHandle * camera,
    const void * buffer,
    uint64_t address,
    size_t length);

GenICam 참조 구현을 사용하려면 GENAPI_NAMESPACE::IPort Framegrabber API와 GenApi 간의 카메라 레지스터 접근을 변환해 주는 래퍼가 필요합니다. 함수 Sgc_memoryReadFromCamera() 및 Sgc_memoryWriteToCamera() 간단하고 직관적인 래퍼 클래스를 만드는 데 사용할 수 있습니다.

class DevicePort: virtual public GENAPI_NAMESPACE::IPort
{
    SgcCameraHandle * camera;

public:
    DevicePort(SgcCameraHandle * camera)
        : camera(camera)
    {}

    GENAPI_NAMESPACE::EAccessMode GetAccessMode() const override
    {
        return GENAPI_NAMESPACE::RW;
    }

    void Read(void * buffer, int64_t address, int64_t length) override
    {
        int result = Sgc_memoryReadFromCamera(camera, buffer, address, length);
        if (result != SGC_OK) {
            // handle error ...
        }
    }

    void Write(const void * buffer, int64_t address, int64_t length) override
    {
        int result = Sgc_memoryWriteToCamera(camera, buffer, address, length);
        if (result != SGC_OK) {
            // handle error ...
        }
    }
};

노드 맵 초기화 및 연결#

int Sgc_loadCameraXml(
    SgcCameraHandle * camera);

GenICam 레퍼런스 구현을 Framegrabber API에 연결하는 최종 단계는 카메라용 GenICam XML 문서를 가져오고, 노드 맵을 생성하여 이를 XML에 연결하는 것입니다.

카메라에서 XML 문서를 다운로드하고 추출하려면 함수를 Sgc_loadCameraXml() 및 Sgc_getCameraPropertyWithType() 을(를) 사용할 수 있습니다. 먼저 함수 Sgc_loadCameraXml() 호출하여 카메라에서 XML 문서를 다운로드해야 합니다. 그런 다음 함수를 Sgc_getCameraPropertyWithType() 전달하여 호출할 수 있습니다. CAM_PROP_XML_DATA 파라미터에 property 및 nullptr 파라미터에 value 을(를) 사용하여 XML 문서를 추출하는 데 필요한 버퍼의 크기를 요청합니다. 필요한 크기의 버퍼를 할당한 후, Sgc_getCameraPropertyWithType() 다시 호출하고, 매개변수에 버퍼에 대한 포인터를 전달할 수 있습니다. value 을(를) 사용하여 XML 문서를 추출합니다.

다음 예제는 카메라에서 XML 문서를 다운로드 및 추출하고, 노드맵을 초기화 및 연결하며, 전송할 이미지의 너비와 높이를 설정하는 방법을 보여줍니다. (이 예제에는 C++ 헤더 파일이 필요합니다.) memory 대상 std::unique_ptr 유형 및 stdexcept 대상 std::runtime_error 및 std::exception 유형입니다.

try {
    // download camera XML
    int result = Sgc_loadCameraXml(camera);
    if (result != SGC_OK)
        throw std::runtime_error("Failed to download camera XML");

    // get size of XML
    unsigned int size = 0;
    unsigned int propertyType = SGC_PROPERTY_TYPE_STRING;
    result =
        Sgc_getCameraPropertyWithType(camera, CAM_PROP_XML_DATA,
                                      nullptr, &propertyType, &size);
    if (result != SGC_OK || size == 0)
        throw std::runtime_error("Failed to determine size of camera XML");

    // create buffer and extract camera XML
    std::unique_ptr<char[]> xml(new char[size]);
    result =
        Sgc_getCameraPropertyWithType(camera, CAM_PROP_XML_DATA,
                                      xml.get(), &propertyType, &size);
    if (result != SGC_OK)
        throw std::runtime_error("Failed to extract camera XML");

    // create device port and node map
    DevicePort port(camera);
    GENAPI_NAMESPACE::CNodeMapRef nodeMap;

    // initialize and connect node map
    nodeMap._LoadXMLFromString(xml.get());
    if (!nodeMap._Connect(&port, "Device"))
        throw std::runtime_error("Failed to connect node map to device port");

    // use node map to access camera features ...

    // set width
    GENAPI_NAMESPACE::CIntegerPtr width = nodeMap._GetNode("Width");
    if (width != nullptr) {
        width->SetValue(1920);
    }

    // set height
    GENAPI_NAMESPACE::CIntegerPtr height = nodeMap._GetNode("Height");
    if (height != nullptr) {
        height->SetValue(1080);
    }

} catch (GENICAM_NAMESPACE::GenericException & x) {
    // handle GenICam exceptions ...
} catch (std::exception & x) {
    // handle C++ standard exceptions ...
}

카메라 연결 변경#

int Sgc_setCameraPropertyWithType(
    SgcCameraHandle * camera,
    const char * property,
    const void * value,
    unsigned int type,
    void * additionalValue);

카메라에서 사용하는 링크 속도나 링크 수를 변경하려면 함수 Sgc_setCameraPropertyWithType() 호출할 수 있습니다. 이는 Sgc_getCameraPropertyWithType() 장에서 설명하는 카메라 정보.

변경할 수 있는 두 가지 Property가 있습니다.

Property 설명 Type
CAM_PROP_LINKSPEED 현재 링크 속도(Mbit/s) uint32_t
CAM_PROP_NROFLINKS 이미지 전송에 사용되는 물리적 링크 수 uint32_t

여러 프로세스에서의 카메라 검색(Discovery) 지원#

int Sgc_initBoardEx(
    Fg_Struct * fg,
    unsigned int flags,
    SgcBoardHandle ** board,
    unsigned int portMask,
    unsigned int mode);
int Sgc_scanPortsEx(
    SgcBoardHandle * board,
    unsigned int portMask,
    int timeout,
    int speed,
    unsigned int flags);

정보

여러 프로세스에서의 카메라 탐색 지원은 Framegrabber API 버전 5.9에 추가되었습니다.

애플리케이션이 단일 프레임 그래버의 카메라에 액세스하기 위해 둘 이상의 프로세스를 사용하는 경우, 프레임 그래버의 물리적 포트당 하나의 프로세스만 Framegrabber API에서 지원됩니다. 단일 프로세스는 둘 이상의 물리적 포트에 액세스할 수 있지만, 어떤 물리적 포트도 여러 프로세스에서 Framegrabber API를 통해 액세스해서는 안 됩니다.

다중 프로세스 애플리케이션에서는 다음 호출을 대체하여 물리적 포트에 대한 접근을 제한할 수 있습니다. Sgc_initBoard() 및 Sgc_scanPorts() 호출 Sgc_initBoardEx() 및 Sgc_scanPortsEx() 그리고 포트 마스크를 사용합니다. 또한, SGC_SP_FLAG_SKIP_AUTO_PORTADJUSTMENT 호출 시 사용해야 합니다. Sgc_scanPortsEx() 매개변수 내 flags 물리적 포트 재매핑을 억제합니다.

포트 마스크는 물리적 포트당 1개의 비트를 사용하며, 비트가 1일 때는 포트 접근이 활성화되고 0일 때는 비활성화됩니다. 비트 0은 물리적 포트 0에 대응하는 식입니다. 기본 포트 마스크에서 0xf 네 포트 모두 비트가 1이므로 네 포트 모두에 대한 접근이 활성화됩니다.

가장 이해하기 쉬운 시나로는 하나의 프레임 그래버와 각각 단일 물리적 포트에 연결된 네 개의 카메라가 있는 설정입니다. 첫 번째 프로세스는 포트 마스크를 사용할 수 있습니다. 0x1, 두 번째 0x2, 세 번째 0x4 그리고 네 번째 0x8. 각 프로세스는 하나의 물리적 포트에서 초기화와 검색을 담당합니다.

카메라가 둘 이상의 링크로 연결된 경우, 카메라는 항상 올바른 물리적 포트에 연결되어야 하므로 상황이 조금 더 복잡해집니다. 예를 들어 첫 번째 프로세스가 다음 포트 마스크를 사용하는 경우 0x3 그리고 두 번째는 포트 마스크를 사용합니다. 0xc, 카메라 케이블은 어떤 경우에도 첫 번째 카메라는 포트 0과 1에, 두 번째 카메라는 포트 2와 3에 연결되어야 합니다. 어떤 이유로든 카메라가 다른 방식으로 연결되면 검색 절차가 실패합니다.


  1. 카메라와 앱렛의 카메라 오퍼레이터는 모두 마스터 ID로 식별할 수 있습니다. 유효한 가장 낮은 마스터 ID는 1입니다. 카메라 마스터 ID는 프레임 그래버 보드 인덱스와 카메라 마스터 포트가 연결된 물리적 포트 번호로부터 생성되는 값입니다. 카메라 오퍼레이터 마스터 ID는 오퍼레이터 마스터 포트가 연결된 논리적 포트로부터 생성되는 값입니다. ↩↩