SingleImage (カラー PPM保存) プロジェクト(GbE-2 / Python)
HelloWorld で作成した共通モジュール puclib.py を使用して、GbE-2(カラーモデル)から 1 フレームの圧縮データを取得し、Bayer変換(デベイヤー)およびホワイトバランス調整を行ってカラー復号した上で、PPM形式(Portable Pixmap) のファイルとして保存するスクリプトの作成手順です。
-
スクリプトの作成
puclib.pyと同じフォルダーにgbe2_single_image_color.pyを作成し、以下のコードを記述します。gbe2_single_image_color.py from ctypes import c_uint32, c_ushort, c_ubyte, c_void_p, byrefimport numpy as np# 共通モジュール puclib.py から読み込みfrom puclib import (load_sdk, PUC_SUCCEEDED, PUC_DETECT_TARGET_GBE2,PUC_Q_COUNT, PUC_DETECT_FILTER, PUC_DETECT_INFO, PUC_XFER_DATA_INFO,PUC_COLOR_COLOR)def main():print("INFINICAM GbE-2 SingleImage (カラー) キャプチャ開始...")# 1. SDKのロードと初期化puclib = load_sdk()if puclib.PUC_Initialize() != PUC_SUCCEEDED:print("エラー: SDKの初期化に失敗しました。")return# 2. デバイスの検索とオープンdetect_filter = PUC_DETECT_FILTER(nDeviceTypeFlags=PUC_DETECT_TARGET_GBE2)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. カラーモデル判定とホワイトバランスゲインの設定color_type = c_uint32()puclib.PUC_GetColorType(h_device, byref(color_type))if color_type.value != PUC_COLOR_COLOR:print("注意: 接続されているカメラはモノクロモデルとして検出されました。")# R, G, B 各チャンネルのホワイトバランスゲインを設定 (1.0 = 無変化)puclib.PUC_SetWhiteBalanceGain(1.0, 1.0, 1.0)# 4. カメラパラメータの取得width, height = c_uint32(), c_uint32()puclib.PUC_GetResolution(h_device, byref(width), byref(height))w, h = width.value, height.valueprint(f"解像度: {w} x {h} ピクセル (カラー)")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))# 5. バッファの確保comp_buffer = (c_ubyte * xfer_data_size.value)()# カラー復号データ (RGB 24bit = 1ピクセルあたり 3 バイト)# 横幅バイト数 (w * 3) を 4 バイト境界にアラインメントline_bytes = ((w * 3) + 3) & ~3decoded_buffer = (c_ubyte * (line_bytes * h))()# 6. キャプチャの実行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:# 7. 圧縮データのカラー復号(デコード処理)# SDK内部で自動的に Bayer 変換(デベイヤー)およびホワイトバランス調整が適用され、# RGBデータ(1ピクセル = 3バイト)として展開されます。ret = puclib.PUC_DecodeData(decoded_buffer, 0, 0, w, h, line_bytes, comp_buffer, q_vals)if ret == PUC_SUCCEEDED:# 8. ctypes バッファを NumPy 配列へ変換 (パディングを除去)img_np = np.ctypeslib.as_array(decoded_buffer).reshape((h, line_bytes))[:, : w * 3]# 9. PPM (P6) フォーマットでファイル保存filename = "captured_color_image.ppm"with open(filename, "wb") as f:header = f"P6\n{w} {h}\n255\n".encode("ascii")f.write(header)f.write(img_np.tobytes())print(f"SUCCESS: PPMカラー画像ファイルを保存しました ({filename})")else:print(f"エラー: 画像データの復号に失敗しました。ErrorCode: {ret}")else:print("エラー: 画像データの取得に失敗しました。")# 10. クローズpuclib.PUC_CloseDevice(h_device)if __name__ == "__main__":main() -
スクリプトの実行
Terminal window python gbe2_single_image_color.py実行完了後、カレントディレクトリに
captured_color_image.ppmが生成されます。
コード解説のポイント
Section titled “コード解説のポイント”1. カラーモデルの判定とホワイトバランス
Section titled “1. カラーモデルの判定とホワイトバランス”PUC_GetColorType() で接続されているカメラがカラーモデルかどうかを確認し、PUC_SetWhiteBalanceGain() で R・G・B 各チャンネルのゲインを設定します。復号時には SDK 内部で自動的に Bayer 変換(デベイヤー)とホワイトバランス調整が適用され、RGB データとして展開されます。
color_type = c_uint32()puclib.PUC_GetColorType(h_device, byref(color_type))puclib.PUC_SetWhiteBalanceGain(1.0, 1.0, 1.0)2. モノクロとのバッファサイズの違い
Section titled “2. モノクロとのバッファサイズの違い”カラー復号バッファは 1 ピクセルあたり RGB 3 バイトになるため、4 バイト境界への切り上げ計算にも w * 3 を使用します。
line_bytes = ((w * 3) + 3) & ~33. PPM (P6) フォーマットでの保存
Section titled “3. PPM (P6) フォーマットでの保存”PGM(モノクロ)と同様に外部の画像エンコードライブラリを使わず、復号バッファの RGB データをそのままテキストヘッダー付きで書き出すだけでカラー画像ファイルが完成します。
