Skip to content

SingleImage + DC成分抽出(GbE-2 / Python)

This content is not available in your language yet.

HelloWorld で作成した共通モジュール puclib.py を使用して、GbE-2 から取得した 1 フレームの圧縮データから DC成分(直流成分)のみを抽出 し、1/8 サイズの軽量プレビュー画像を超高速に復号・保存するスクリプトの作成手順です。

  1. スクリプトの作成

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

    gbe2_single_image_dc.py
    from ctypes import c_uint32, c_ubyte, c_void_p, byref
    import numpy as np
    # 共通モジュール puclib.py から読み込み
    from puclib import (
    load_sdk, PUC_SUCCEEDED, PUC_DETECT_TARGET_HAWK,
    PUC_DETECT_FILTER, PUC_DETECT_INFO, PUC_XFER_DATA_INFO
    )
    def main():
    print("INFINICAM GbE-2 DC成分抽出 (1/8 縮小プレビュー) 開始...")
    # 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
    xfer_data_size = c_uint32()
    puclib.PUC_GetXferDataSize(h_device, byref(xfer_data_size))
    print(f"原画像解像度: {w} x {h} ピクセル")
    # 4. DC成分(1/8 縮小画像)用パラメータおよびバッファの計算
    dc_w = w // 8
    dc_h = h // 8
    dc_line_bytes = (dc_w + 3) & ~3 # 4バイト境界アラインメント
    print(f"DC抽出画像解像度: {dc_w} x {dc_h} ピクセル")
    comp_buffer = (c_ubyte * xfer_data_size.value)()
    decoded_dc_buffer = (c_ubyte * (dc_line_bytes * dc_h))()
    # 5. 1フレームキャプチャの実行
    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. DC成分(直流成分)のみを抽出復号
    ret = puclib.PUC_DecodeDCData(
    decoded_dc_buffer, 0, 0, w, h, comp_buffer
    )
    if ret == PUC_SUCCEEDED:
    # 7. NumPy 配列化 (1/8 サイズで整形)
    img_dc = np.ctypeslib.as_array(decoded_dc_buffer).reshape((dc_h, dc_line_bytes))[:, :dc_w]
    # 8. PGM ファイルとして保存
    filename = "dc_preview_image.pgm"
    with open(filename, "wb") as f:
    header = f"P5\n{dc_w} {dc_h}\n255\n".encode("ascii")
    f.write(header)
    f.write(img_dc.tobytes())
    print(f"SUCCESS: DC抽出画像 (PGM) を保存しました ({filename})")
    else:
    print(f"エラー: DC成分の抽出に失敗しました。ErrorCode: {ret}")
    else:
    print("エラー: 画像データの取得に失敗しました。")
    # 9. クローズ
    puclib.PUC_CloseDevice(h_device)
    if __name__ == "__main__":
    main()
  2. スクリプトの実行

    Terminal window
    python gbe2_single_image_dc.py

    実行完了後、縦横がそれぞれの 1/8 サイズ(例: 1280x1024 の場合 160x128 ピクセル)になった極小画像ファイル dc_preview_image.pgm が即座に生成されます。


DC 成分抽出(PUC_DecodeDCData)のポイント

Section titled “DC 成分抽出(PUC_DecodeDCData)のポイント”

1. 逆 DCT 演算・量子化テーブル計算を一切スキップ

Section titled “1. 逆 DCT 演算・量子化テーブル計算を一切スキップ”

8×8 ブロック単位の DCT 圧縮データから、輝度の平均値を表す DC成分(直流成分)のみを取り出す ため、重い逆離散コサイン変換(IDCT)や逆量子化処理を一切行いません。全画素展開(PUC_DecodeData)と比較して圧倒的に高速な復号処理が可能です。

  • リアルタイム超高速サムネイル描画: 低負荷でフレーム内容の確認を行う。
  • 低負荷動体検知: 解像度を落とした状態でフレーム間差分を監視し、大きな動きがあった場合のみフルデコードを実行する。