SingleImage + DC成分抽出(GbE-2 / Python)
HelloWorld で作成した共通モジュール puclib.py を使用して、GbE-2 から取得した 1 フレームの圧縮データから DC成分(直流成分)のみを抽出 し、1/8 サイズの軽量プレビュー画像を超高速に復号・保存するスクリプトの作成手順です。
-
スクリプトの作成
puclib.pyと同じフォルダーにgbe2_single_image_dc.pyを作成し、以下のコードを記述します。gbe2_single_image_dc.py from ctypes import c_uint32, c_ubyte, c_void_p, byrefimport 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 カメラが見つかりませんでした。")returnh_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.valuexfer_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 // 8dc_h = h // 8dc_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_bufferxfer_info.nDataSize = xfer_data_size.valueprint("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() -
スクリプトの実行
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)と比較して圧倒的に高速な復号処理が可能です。
2. 活用ユースケース
Section titled “2. 活用ユースケース”- リアルタイム超高速サムネイル描画: 低負荷でフレーム内容の確認を行う。
- 低負荷動体検知: 解像度を落とした状態でフレーム間差分を監視し、大きな動きがあった場合のみフルデコードを実行する。
