콘텐츠로 바로 가기

siso_genicam#

siso_genicam 라이브러리는 GenICam 표준을 준수하는 카메라의 검색, 카메라 Property 액세스, 그리고 카메라 명령어 실행을 관리합니다. 본 문서에서는 이러한 Property와 명령어를 Feature라고 지칭합니다.

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

#include <siso_genicam.h>

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

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

카메라 제어 라이브러리에서의 오류 처리#

const char * Sgc_getErrorDescription(
    int result);

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

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

본 문서의 나머지 부분에 있는 코드 예제에는 애플리케이션의 요구 사항에 따라 달라지는 오류 처리가 포함되지 않습니다. 그러나 가능한 한 함수가 성공적으로 실행되었는지 반환 코드를 확인합니다.

카메라 제어 라이브러리 초기화#

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() 애플리케이션이 사용하는 모든 프레임 그래버에 대해 호출해야 합니다. Parameter flags 은 향후 확장을 위해 예약되어 있으며 애플리케이션은 항상 0을 전달해야 합니다. 초기화가 성공하면 보드 핸들이 Parameter에 전달된 변수에 저장됩니다. 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);

카메라 검색#

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라고 합니다. 카อล라는 하나 이상의 Link 구성을 지원합니다. 예를 들어 CoaXPress 카메라는 다양한 Link 구성을 지원할 수 있습니다. 예를 들어 4개의 물리적 포트가 있는 카메라는 CoaXPress 2.0 Link 속도의 하위 집합(3.125, 5, 6.25, 10, 12.5 Gbit/s)을 사용하여 1개, 2개 또는 4개의 Link를 사용하는 구성을 지원할 수 있습니다. 따라서 이 카메라는 총 15개의 서로 다른 Link 구성을 지원하게 됩니다.

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

하나 이상의 프레임 그래버에 대해 단일 프로세스를 사용하는 애플리케이션에서는 포트 마스크가 항상 다음으로 지정되어야 합니다. 0xf. 이 방식을 통해 프레임 그래버의 모든 포트에서 카메라를 검색합니다. 애플리케이션이 프레임 그래버에 대해 여러 프로세스를 사용하는 경우, 다음 장을 참조하십시오. 다중 프로세스에서의 카메라 검색 지원.

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

(또한 애플리케이션 레이아웃을 설명하는 다이어그램을 보려면 Understanding Image Data Flow 장을 참조하십시오. 프레임 그래버에 연결된 각 카메라에 대해, 애플리케이션에는 해당 카메라 오퍼레이터가 필요합니다. 카메라 오퍼레이터의 수는 각 애플리케이션의 고정된 Property입니다. 프레임 그래버에 연결된 카메라에 사용할 애플리케이션을 선택하는 방법을 이해하려면 The Frame Grabber Library fglib5 파트의 Frame Grabber Initialization 장 끝에 있는 주석을 검토할 수도 있습니다.)

다음에 대한 호출이 Sgc_scanPorts() 호출이 SGC_OK인 경우, 지정된 시간 내에 하나 이상의 카메라가 발견되었으며 앱릿과 카메라가 일치될 수 있음을 의미합니다. 반환 값이 ERR_SGC_TOPOLOGY_MISMATCH인 경우, 하나 이상의 카อล라는 발견되었으나 앱릿과 카메라가 일치하지 않으며, 카메라와의 통신은 여전히 가능하지만 카메라에서 앱릿으로 이미지 데이터가 올바르게 전송될 수 없습니다.

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

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

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 ...
}

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

둘 이상의 카메라를 사용하는 애플리케이션의 경우, 검색을 처리하는 권장 방법은 다음 장에서 설명하는 대로 콜백 함수를 등록하는 것입니다. 검색 이벤트를 위한 콜백 함수 등록, 그런 다음 호출합니다 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 ...

카메라 검색 재시작#

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

정보

파라미터에 0을 전달하여 호출할 때의 함수 Sgc_scanPortsEx() Framegrabber API 버전 5.9에서 변경되었습니다.

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

카메라 기능 작업#

카메라를 감지한 후 응용 프로그램은 카메라 기능을 사용할 수 있습니다. 이러한 기능, 카메라 매개변수 및 명령은 표준화된 기능 인터페이스를 통해 카메라에서 다운로드하거나 카메라 제조업체가 제공하는 다른 방법(예: 일부 카메라 제조업체에서 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. 함수 Sgc_connectCameraWithExternalXml() 는 추가로 파라미터에서 file XML 파일의 경로를 필요로 합니다.

응용 프로그램에서 카메라 기능 사용이 끝나면 Sgc_disconnectCamera().

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

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 파라미터에서 값이 저장될 해당 타입의 변수에 대한 포인터를 필요로 합니다. value.

문자열로 표현되는 카메라 파라미터의 값을 요청하는 함수인 Sgc_getStringValue() 및 Sgc_getEnumerationValueAsString()은(는) char * 에 value타입의 변수에 대한 포인터를 필요로 합니다. 이 변수에는 문자열 값에 대한 포인터가 저장됩니다.

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

값을 설정하려면 Sgc_setIntegerValue(), Sgc_setBooleanValue(), Sgc_setFloatValue(), Sgc_setStringValue() 및 Sgc_setEnumerationValue() 함수를 호출할 수 있습니다. 이 함수들은 파라미터에서 카메라 핸들을 필요로 하며, camera파라미터에서 기능 이름을 필요로 하며, 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 및 다음 유형의 변수에 대한 포인터를 요구합니다 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, 파라미터로 연결 Property을(를) property, 값이 저장될 변수에 대한 포인터, 그리고 Property의 유형을 반영하도록 초기화되어야 하는 unsigned int 형식의 변수에 대한 포인터를 요구합니다. 파라미터 additionalValue 은(는) 아래에 문서화된 바와 같이 일부 Property에 필요합니다.

Property 설명 Type
CAM_PROP_MASTERID 카메라의 마스터 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 애플릿 카메라 포트의 마스터 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 데이터 (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++ Type
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()(예: User ID 문자열 설정 또는 카메라 펌웨어 버전 업데이트 등), 다음 함수 Sgc_updateCameraInfos() 을 호출하여 Framegrabber API의 데이터 업데이트를 요청해야 합니다.

이미지 데이터 흐름 이해#

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

Data Flow Straight

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

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

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

Data Flow Crossed

이미지 전송이 올바르게 작동하려면 검색 절차를 통해 프레임 그래버의 물리적 포트를 위 다이어그램에 표시된 방식으로 카메라 오퍼레이터의 논리적 포트에 연결해야 합니다. (다이어그램을 보면 Master id 2인 카메라가 Master id 0인 카메라 오퍼레이터에 연결되는 두 번째 가능성도 있습니다. 이는 검색 절차를 처음 실행할 때 카메라가 한 대만 연결되어 있었고 두 번째 카อล라는 나중에 추가된 경우에 해당할 수 있습니다.)

그럼에도 불구하고 동일한 카메라 Property인 CAM_PROP_APPLETOPERATORINDEX만으로도 올바른 DMA 채널을 알 수 있습니다.

검색 이벤트를 위한 콜백 함수 등록#

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.

The struct SgcEventInfo 인스턴스는 멤버에서 이벤트의 식별자를 포함하고, eventID 그리고 유니온 멤버에서 추가 데이터를 포함합니다. 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++ 클래스 컨텍스트에서 콜백 함수를 사용하려면, 정적(static) 함수를 사용하여 콜백 핸들러를 등록하고, this 포인터를 컨텍스트 데이터 포인터로 사용하여 클래스 포인터로 다시 캐스팅한 후 그에 맞춰 사용할 수 있습니다.

검색 상태 변경 정보#

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

#include <GenICam.h>

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

  • 애플리케이션이 Windows에서 64비트 Framegrabber SDK를 사용하는 경우:
  • 추가 %BASLER_FG_SDK_DIR%\bin 을(를) 시스템 환경 변수에 PATH
  • 추가 %BASLER_FG_SDK_DIR%\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 을(를) 프로젝트 포함 디렉터리에
  • 라이브러리 추가 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

다중 프로세스에서의 카메라 검색 지원#

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 에서는 4개 포트 모두의 비트가 1이므로 4개 포트 모두에 대한 액세스가 활성화됩니다.

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

카메라가 둘 이상의 링크로 연결된 경우를 고려하면 상황이 좀 더 복잡해집니다. 카메라는 항상 올바른 물리적 포트에 연결되어야 하기 때문입니다. 예를 들어 첫 번째 프로세스가 포트 마스크 0x3 을(를) 사용하고 두 번째 프로세스가 포트 마스크 0xc을(를) 사용하는 경우, 카메라 케이블은 어떠한 경우에도 첫 번째 카메라는 포트 0과 1에, 두 번째 카메라는 포트 2와 3에 연결되어야 합니다. 어떤 시점이라도 카메라가 다른 방식으로 연결되면 검색 절차가 실패합니다.


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