Skip to content

SingleImage (PGM保存) プロジェクト(GbE-2 / Python)

This content is not available in your language yet.

HelloWorld で作成した共通モジュール puclib.py を使用して、GbE-2 から 1 フレームの圧縮画像データを取得・復号し、PGM形式(Portable Graymap) のファイルとして保存するスクリプトの作成手順です。

  1. スクリプトの作成

    puclib.py と同じフォルダーに gbe2_single_image_pgm.py を作成し、以下のコードを記述します。

    gbe2_single_image_pgm.py
    from ctypes import c_uint32, c_ushort, c_ubyte, c_void_p, byref
    import numpy as np
    # 共通モジュール puclib.py から読み込み
    from puclib import (
    load_sdk, PUC_SUCCEEDED, PUC_DETECT_TARGET_HAWK,
    PUC_Q_COUNT, PUC_DETECT_FILTER, PUC_DETECT_INFO, PUC_XFER_DATA_INFO
    )
    def main():
    print("INFINICAM GbE-2 SingleImage (PGM) キャプチャ開始...")
    # 1. SDKのロードと初期化
    puclib = load_sdk()
    if puclib.PUC_Initialize() != PUC_SUCCEEDED:
    print("エラー: SDKの初期化に失敗しました。")
    return
    # 2. デバイスの検索とオープン
    detect_filter = PUC_DETECT_FILTER(nDeviceTypeFlags=PUC_DETECT_TARGET_HAWK)
    detect_info = PUC_DETECT_INFO()
    if puclib.PUC_DetectDevice2(byref(detect_filter), byref(detect_info)) != PUC_SUCCEEDED or detect_info.nDeviceCount == 0:
    print("エラー: GbE-2 カメラが見つかりませんでした。")
    return
    h_device = c_void_p()
    if puclib.PUC_OpenDevice2(0, byref(h_device)) != PUC_SUCCEEDED:
    print("エラー: デバイスのオープンに失敗しました。")
    return
    # 3. カメラパラメータの取得
    width, height = c_uint32(), c_uint32()
    puclib.PUC_GetResolution(h_device, byref(width), byref(height))
    w, h = width.value, height.value
    q_vals = (c_ushort * PUC_Q_COUNT)()
    puclib.PUC_GetQuantization2(h_device, q_vals)
    xfer_data_size = c_uint32()
    puclib.PUC_GetXferDataSize(h_device, byref(xfer_data_size))
    print(f"解像度: {w} x {h} ピクセル")
    # 4. バッファの確保
    comp_buffer = (c_ubyte * xfer_data_size.value)()
    line_bytes = (w + 3) & ~3 # 4バイト境界アラインメント
    decoded_buffer = (c_ubyte * (line_bytes * h))()
    # 5. キャプチャの実行
    xfer_info = PUC_XFER_DATA_INFO()
    xfer_info.pData = comp_buffer
    xfer_info.nDataSize = xfer_data_size.value
    print("1フレームのキャプチャを実行中...")
    if puclib.PUC_GetSingleXferData(h_device, byref(xfer_info)) == PUC_SUCCEEDED:
    # 6. 復号処理
    ret = puclib.PUC_DecodeData(
    decoded_buffer, 0, 0, w, h, line_bytes, comp_buffer, q_vals
    )
    if ret == PUC_SUCCEEDED:
    # 7. ctypes バッファを NumPy 配列へ変換 (パディングを除去)
    img_np = np.ctypeslib.as_array(decoded_buffer).reshape((h, line_bytes))[:, :w]
    # 8. PGM (P5) フォーマットでファイル保存
    filename = "captured_image.pgm"
    with open(filename, "wb") as f:
    header = f"P5\n{w} {h}\n255\n".encode("ascii")
    f.write(header)
    f.write(img_np.tobytes())
    print(f"SUCCESS: PGM画像ファイルを保存しました ({filename})")
    else:
    print(f"エラー: 画像データの復号に失敗しました。ErrorCode: {ret}")
    else:
    print("エラー: 画像データの取得に失敗しました。")
    # 9. クローズ
    puclib.PUC_CloseDevice(h_device)
    if __name__ == "__main__":
    main()
  2. スクリプトの実行

    Terminal window
    python gbe2_single_image_pgm.py

    実行完了後、カレントディレクトリに captured_image.pgm が生成されます。


1. モジュール読み込みによる記述の大幅削減

Section titled “1. モジュール読み込みによる記述の大幅削減”

puclib.py を呼び出すことで、DLL の型定義や C 構造体の宣言をスクリプト内に直接書く必要がなくなりました。

from puclib import (
load_sdk, PUC_SUCCEEDED, PUC_DETECT_TARGET_HAWK,
PUC_Q_COUNT, PUC_DETECT_FILTER, PUC_DETECT_INFO, PUC_XFER_DATA_INFO
)

2. ctypes バッファから NumPy 配列への変換

Section titled “2. ctypes バッファから NumPy 配列への変換”

np.ctypeslib.as_array() を使うと、復号バッファ (decoded_buffer) をメモリコピーなしで直接 NumPy 配列化できます。

img_np = np.ctypeslib.as_array(decoded_buffer).reshape((h, line_bytes))[:, :w]
  • reshape((h, line_bytes)): 4バイト境界アラインメント(line_bytes)を考慮した2次元形状に並べ替えます。
  • [:, :w]: 境界揃えのために行末に自動付与されている余分なパディングバイトをカットし、実際の画像サイズ (w x h) を取り出します。