Skip to content

SingleImage (カラー) プロジェクトの作成

This content is not available in your language yet.

GbE-2(カラーモデル)から 1 フレームの圧縮データを取得し、Bayer変換(デベイヤー)およびホワイトバランス調整を行ってカラー復号した上で、標準的な画像表示ソフトで閲覧可能な PPM形式(Portable Pixmap) のファイルとして保存するプログラムの作成手順です。

  1. ソースコードの記述

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

    #include <stdio.h>
    #include <stdlib.h>
    #include <PUCLIB.h> // PUCLIB ヘッダーの読み込み
    int main() {
    printf("INFINICAM GbE-2 SingleImage (カラー) キャプチャ開始...\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_COLOR_TYPE colorType = PUC_COLOR_MONO;
    PUC_GetColorType(hDevice, &colorType);
    if (colorType != PUC_COLOR_COLOR) {
    printf("注意: 接続されているカメラはモノクロモデルとして検出されました。\n");
    }
    // R, G, B 各チャンネルのホワイトバランスゲインを設定 (1.0 = 無変化)
    PUC_SetWhiteBalanceGain(1.0, 1.0, 1.0);
    // 5. 解像度の取得
    UINT32 width = 0, height = 0;
    ret = PUC_GetResolution(hDevice, &width, &height);
    if (ret != PUC_SUCCEEDED) {
    printf("エラー: 解像度の取得に失敗しました。ErrorCode: %d\n", ret);
    PUC_CloseDevice(hDevice);
    return EXIT_FAILURE;
    }
    printf("解像度: %u x %u ピクセル (カラー)\n", width, height);
    // 6. 量子化テーブルの一括取得(デコード処理用)
    unsigned short qVals[PUC_Q_COUNT] = { 0 };
    ret = PUC_GetQuantization2(hDevice, qVals);
    if (ret != PUC_SUCCEEDED) {
    printf("エラー: 量子化テーブルの取得に失敗しました。ErrorCode: %d\n", ret);
    PUC_CloseDevice(hDevice);
    return EXIT_FAILURE;
    }
    // 7. 転送データサイズの取得とバッファの確保
    UINT32 xferDataSize = 0;
    ret = PUC_GetXferDataSize(hDevice, &xferDataSize);
    if (ret != PUC_SUCCEEDED) {
    printf("エラー: 転送データサイズの取得に失敗しました。ErrorCode: %d\n", ret);
    PUC_CloseDevice(hDevice);
    return EXIT_FAILURE;
    }
    // 圧縮データ格納用バッファの確保
    unsigned char* pCompressedBuffer = (unsigned char*)malloc(xferDataSize);
    // カラー復号データ格納用バッファの確保 (RGB 24bit = 1ピクセルあたり 3 バイト)
    // 横幅バイト数 (width * 3) を 4 バイト境界にアラインメント
    UINT32 lineBytes = ((width * 3) + 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("1フレームのキャプチャを実行中...\n");
    ret = PUC_GetSingleXferData(hDevice, &xferDataInfo);
    if (ret == PUC_SUCCEEDED) {
    // 9. 圧縮データのカラー復号(デコード処理)
    // SDK内部で自動的に Bayer 変換(デベイヤー)およびホワイトバランス調整が適用され、
    // RGBデータ(1ピクセル = 3バイト)として展開されます。
    ret = PUC_DecodeData(pDecodedBuffer, 0, 0, width, height, lineBytes, pCompressedBuffer, qVals);
    if (ret == PUC_SUCCEEDED) {
    // 10. 復号したカラー画像を PPM (P6) フォーマットで保存
    const char* filename = "captured_color_image.ppm";
    FILE* fp = NULL;
    if (fopen_s(&fp, filename, "wb") == 0 && fp != NULL) {
    // PPM ヘッダーの書き込み (P6 / 幅 / 高さ / 最大階調値 255)
    fprintf(fp, "P6\n%u %u\n255\n", width, height);
    // 有効カラー画像データ部分 (RGB 3バイト/px) を 1 行ずつ書き込み
    for (UINT32 y = 0; y < height; y++) {
    fwrite(pDecodedBuffer + (y * lineBytes), sizeof(unsigned char), width * 3, fp);
    }
    fclose(fp);
    printf("SUCCESS: PPMカラー画像ファイルを保存しました (%s)\n", filename);
    } else {
    printf("エラー: ファイルの保存に失敗しました。\n");
    }
    } else {
    printf("エラー: 画像データの復号に失敗しました。ErrorCode: %d\n", ret);
    }
    } else {
    printf("エラー: 画像データの取得に失敗しました。ErrorCode: %d\n", ret);
    }
    // 11. メモリ解放とデバイスのクローズ
    free(pCompressedBuffer);
    free(pDecodedBuffer);
    PUC_CloseDevice(hDevice);
    return EXIT_SUCCESS;
    }
  2. ビルドと実行

    1. Ctrl + Shift + B を押してプロジェクトをビルドします。
    2. 実行ファイル(.exe)と同じフォルダーに puclib.dll 等が配置されていることを確認します。
    3. Ctrl + F5 で実行します。プロジェクトフォルダー直下に captured_color_image.ppm が生成されれば成功です。

PPM(Portable Pixmap Format) は、Netpbm プロジェクトで標準化された非圧縮フルカラー画像フォーマットです。テキスト形式のヘッダーと、RGB各8bit(計24bitカラー)のバイナリピクセルデータで構成されています。

P6
800 600
255
[バイナリのRGBピクセルデータ(幅×高さ×3 バイト)]
  1. マジックナンバー (P6): バイナリ形式のフルカラー(RGB 24bit)画像であることを示します。
  2. 画像の幅と高さ: 800 600 のように、ピクセル単位の解像度を指定します。
  3. 最大輝度値 (255): 各カラーチャンネル(R, G, B)の最大階調値を指定します。
  4. ピクセルデータ: 改行の直後から、R・G・B の順(1ピクセル=3バイト)で輝度データがそのまま並びます。