撮影条件変更 + SingleImage(GbE-2 / Python)
HelloWorld で作成した共通モジュール puclib.py を使用して、GbE-2 の 解像度 (Resolution)、フレームレート (FPS)、シャッター速度 (露光時間) をプログラムから変更した上で、画像を 1 フレームキャプチャ・保存するスクリプトの作成手順です。
-
スクリプトの作成
puclib.pyと同じフォルダーにgbe2_single_image_settings.pyを作成し、以下のコードを記述します。gbe2_single_image_settings.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_HAWK,PUC_Q_COUNT, PUC_DETECT_FILTER, PUC_DETECT_INFO, PUC_XFER_DATA_INFO)def main():print("INFINICAM GbE-2 撮影条件変更サンプル開始...")# 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. 撮影条件の変更 (設定)# =========================================================target_width = 640target_height = 480target_fps = 1000target_shutter = 20000 # 1/20000 秒print(f"\n[設定要求] 解像度: {target_width}x{target_height}, フレームレート: {target_fps}fps, シャッター: 1/{target_shutter}秒")# 解像度の設定ret_res = puclib.PUC_SetResolution(h_device, target_width, target_height)if ret_res != PUC_SUCCEEDED:print(f"警告: 解像度の変更に失敗しました。ErrorCode: {ret_res}")# フレームレートとシャッター速度の設定ret_fps = puclib.PUC_SetFramerateShutter(h_device, target_fps, target_shutter)if ret_fps != PUC_SUCCEEDED:print(f"警告: 撮影速度の変更に失敗しました。ErrorCode: {ret_fps}")# =========================================================# 4. 変更後のパラメータ取得 (確認)# =========================================================# カメラ側のハードウェア制限により、要求した値が直近の有効な値に丸められる場合があります。# そのため、設定後は必ず現在の状態を取り直してバッファ計算等を行います。actual_w, actual_h = c_uint32(), c_uint32()puclib.PUC_GetResolution(h_device, byref(actual_w), byref(actual_h))w, h = actual_w.value, actual_h.valueq_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} ピクセル (確保データサイズ: {xfer_data_size.value} Byte)\n")# 5. バッファの確保comp_buffer = (c_ubyte * xfer_data_size.value)()line_bytes = (w + 3) & ~3 # 4バイト境界アラインメントdecoded_buffer = (c_ubyte * (line_bytes * h))()# 6. 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:# 7. 復号処理ret = puclib.PUC_DecodeData(decoded_buffer, 0, 0, w, h, line_bytes, comp_buffer, q_vals)if ret == PUC_SUCCEEDED:# 8. NumPy 配列化 (パディング除去)img_np = np.ctypeslib.as_array(decoded_buffer).reshape((h, line_bytes))[:, :w]# 9. PGM ファイルとして保存filename = "settings_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: 変更された条件で画像を保存しました ({filename})")else:print(f"エラー: 画像データの復号に失敗しました。ErrorCode: {ret}")else:print("エラー: 画像データの取得に失敗しました。")# 10. クローズpuclib.PUC_CloseDevice(h_device)if __name__ == "__main__":main() -
スクリプトの実行
Terminal window python gbe2_single_image_settings.py実行すると、カメラの解像度が 640×480、撮影速度が 1000 fps (シャッター 1/20,000秒) に変更された上で撮影が行われ、
settings_captured_image.pgmとして保存されます。
撮影条件変更のポイント
Section titled “撮影条件変更のポイント”1. PUC_SetResolution による解像度の変更
Section titled “1. PUC_SetResolution による解像度の変更”解像度を変更すると、転送される1フレームあたりのデータサイズ (XferDataSize) も変動します。解像度を変更した直後は、必ず PUC_GetXferDataSize を再度呼び出して受信バッファの大きさを再計算してください。
2. カメラ仕様に準じた値の丸め処理
Section titled “2. カメラ仕様に準じた値の丸め処理”要求した解像度やフレームレートがセンサーのハードウェア制約(例: 指定された解像度での最大FPSを超えている、など)に反している場合、SDK はエラーを返すか、設定可能なもっとも近い安全な値へと自動的にパラメータを丸めることがあります。そのため、PUC_Set... を呼んだあとは必ず PUC_Get... 系関数を呼び、実際にカメラに適用された設定値を取得して確認する実装が推奨されます。
