コンテンツにスキップ

外部機器同期設定 + SingleImage(GbE-2 / C++)

GbE-2 を外部のパルス信号(SYNC IN)に同期して撮影する外部機器同期モードの設定方法と、1 フレームの画像をキャプチャして PGM 形式で保存するプログラムの作成手順です。

  1. ソースコードの記述

    メインファイル(GbE2_ExternalSync.cpp など)を開き、以下のコードに書き換えます。

    #include <stdio.h>
    #include <stdlib.h>
    #include <PUCLIB.h> // PUCLIB ヘッダーの読み込み
    int main() {
    printf("INFINICAM GbE-2 外部機器同期設定 & キャプチャ開始...\n");
    // 1. SDKの初期化
    PUCRESULT ret = PUC_Initialize();
    if (ret != PUC_SUCCEEDED) {
    printf("エラー: SDKの初期化に失敗しました。ErrorCode: %d\n", ret);
    return EXIT_FAILURE;
    }
    // 2. ネットワーク上の GbE-2 デバイスを検索
    PUC_DETECT_FILTER filter = { 0 };
    filter.nDeviceTypeFlags = PUC_DETECT_TARGET_HAWK; // GbE-2 を指定
    PUC_DETECT_INFO detectInfo = { 0 };
    ret = PUC_DetectDevice2(&filter, &detectInfo);
    if (ret != PUC_SUCCEEDED || detectInfo.nDeviceCount == 0) {
    printf("エラー: GbE-2 カメラが見つかりませんでした。ErrorCode: %d\n", ret);
    return EXIT_FAILURE;
    }
    // 3. 検出した最初のデバイスをオープン
    PUC_HANDLE hDevice = NULL;
    ret = PUC_OpenDevice2(0, &hDevice);
    if (ret != PUC_SUCCEEDED) {
    printf("エラー: デバイスのオープンに失敗しました。ErrorCode: %d\n", ret);
    return EXIT_FAILURE;
    }
    // 4. あらかじめ希望の撮影速度とシャッター速度を設定
    // ※外部同期設定前に撮影パラメータを設定しておく必要があります
    PUC_SetFramerateShutter(hDevice, 1000, 1000); // 1000fps, シャッター 1/1000秒
    // 5. 外部機器同期(正極性パルス)にモードを変更
    // 第2引数: PUC_SYNC_EXTERNAL (外部同期), 第3引数: PUC_SIGNAL_POSI (正極性)
    ret = PUC_SetSyncInMode(hDevice, PUC_SYNC_EXTERNAL, PUC_SIGNAL_POSI);
    if (ret != PUC_SUCCEEDED) {
    printf("エラー: 外部同期モードへの設定に失敗しました。ErrorCode: %d\n", ret);
    PUC_CloseDevice(hDevice);
    return EXIT_FAILURE;
    }
    printf("外部機器同期(正極性)に設定しました。\n");
    // 6. 解像度・量子化テーブル・転送データサイズを取得
    UINT32 width = 0, height = 0;
    PUC_GetResolution(hDevice, &width, &height);
    unsigned short qVals[PUC_Q_COUNT] = { 0 };
    PUC_GetQuantization2(hDevice, qVals);
    UINT32 xferDataSize = 0;
    PUC_GetXferDataSize(hDevice, &xferDataSize);
    // 7. メモリバッファの確保
    unsigned char* pCompressedBuffer = (unsigned char*)malloc(xferDataSize);
    UINT32 lineBytes = (width + 3) & ~3;
    unsigned long decodedBufferSize = (unsigned long)lineBytes * height;
    unsigned char* pDecodedBuffer = (unsigned char*)malloc(decodedBufferSize);
    if (pCompressedBuffer == NULL || pDecodedBuffer == NULL) {
    printf("エラー: メモリ割り当てに失敗しました。\n");
    free(pCompressedBuffer);
    free(pDecodedBuffer);
    PUC_CloseDevice(hDevice);
    return EXIT_FAILURE;
    }
    // 8. 外部同期信号に同期して 1 フレームデータをキャプチャ
    PUC_XFER_DATA_INFO xferDataInfo = { 0 };
    xferDataInfo.pData = pCompressedBuffer;
    xferDataInfo.nDataSize = xferDataSize;
    printf("外部同期パルスの待ち受け中 (キャプチャ実行)...\n");
    ret = PUC_GetSingleXferData(hDevice, &xferDataInfo);
    if (ret == PUC_SUCCEEDED) {
    // 9. 圧縮データの復号(デコード処理)
    ret = PUC_DecodeData(pDecodedBuffer, 0, 0, width, height, lineBytes, pCompressedBuffer, qVals);
    if (ret == PUC_SUCCEEDED) {
    // 10. 復号した画像を PGM (P5) フォーマットで保存
    const char* filename = "ext_sync_image.pgm";
    FILE* fp = NULL;
    if (fopen_s(&fp, filename, "wb") == 0 && fp != NULL) {
    fprintf(fp, "P5\n%u %u\n255\n", width, height);
    for (UINT32 y = 0; y < height; y++) {
    fwrite(pDecodedBuffer + (y * lineBytes), sizeof(unsigned char), width, fp);
    }
    fclose(fp);
    printf("SUCCESS: 外部同期撮影画像を保存しました (%s)\n", filename);
    } else {
    printf("エラー: ファイルの保存に失敗しました。\n");
    }
    } else {
    printf("エラー: 画像データの復号に失敗しました。ErrorCode: %d\n", ret);
    }
    } else {
    // 外部信号が入力されていない場合やタイムアウト時はここでエラーになります
    printf("エラー: 画像データの取得に失敗しました (外部信号未入力またはタイムアウト)。ErrorCode: %d\n", ret);
    }
    // 11. 後処理(同期モードを内部同期に戻して終了)
    PUC_SetSyncInMode(hDevice, PUC_SYNC_INTERNAL, PUC_SIGNAL_POSI);
    free(pCompressedBuffer);
    free(pDecodedBuffer);
    PUC_CloseDevice(hDevice);
    return EXIT_SUCCESS;
    }
  2. ビルドと実行

    1. Ctrl + Shift + B を押してビルドを行います。
    2. GbE-2 の SYNC IN 端子に外部信号源(ファンクションジェネレータ等)を接続します。
    3. Ctrl + F5 で実行します。外部信号入力に同期して撮影が行われ、実行フォルダー直下に ext_sync_image.pgm が生成されれば成功です。

1. 同期モード設定関数 (PUC_SetSyncInMode)

Section titled “1. 同期モード設定関数 (PUC_SetSyncInMode)”
PUC_SetSyncInMode(hDevice, nMode, nSignal);
  • nMode: 同期入力モードを指定します。
    • PUC_SYNC_INTERNAL : 内部同期(カメラ内部のクロックで自走撮影)
    • PUC_SYNC_EXTERNAL : 外部信号同期(SYNC IN ポートに入力されたパルスに同期)
    • PUC_SYNC_EXTERNAL_PTP : PTP(Precision Time Protocol)マスタークロック同期
  • nSignal: 立ち上がり/立ち下がりエッジ(極性)を指定します。
    • PUC_SIGNAL_POSI : 正極性(立ち上がりエッジ同期)
    • PUC_SIGNAL_NEGA : 負極性(立ち下がりエッジ同期)

外部機器同期を設定すると、カメラは入力パルスのばらつきを考慮した露光時間へと自動調整を行います。そのため、必ず PUC_SetFramerateShutter(または PUC_SetExposeTime)で目的の撮影速度・シャッター速度に変更してから、PUC_SetSyncInMode を呼び出す ようにしてください。