外部機器同期設定(GbE-2 / Python)
This content is not available in your language yet.
HelloWorld で作成した共通モジュール puclib.py を使用して、GbE-2 を 外部トリガー・パルス信号 (SYNC IN) に同期させて撮影を開始するスクリプトの作成手順です。
-
スクリプトの作成
puclib.pyと同じフォルダーにgbe2_external_sync.pyを作成し、以下のコードを記述します。gbe2_external_sync.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)# 同期モード定数PUC_SYNC_IN_OFF = 0 # 内部トリガー(通常撮影)PUC_SYNC_IN_ON = 1 # 外部トリガー同期 (SYNC IN)def main():print("INFINICAM GbE-2 外部機器同期 (SYNC IN) サンプル開始...")# 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. 外部同期 (SYNC IN) モードの有効化# =========================================================# PUC_SetSyncInMode(hDevice, nMode, nOption)# nMode : 0 = OFF (内部クロック), 1 = ON (外部入力同期)# nOption: 予約(通常 0)ret_sync = puclib.PUC_SetSyncInMode(h_device, PUC_SYNC_IN_ON, 0)if ret_sync == PUC_SUCCEEDED:print("外部トリガー同期モード (SYNC IN) を設定しました。")else:print(f"エラー: 外部同期モードの設定に失敗しました。ErrorCode: {ret_sync}")puclib.PUC_CloseDevice(h_device)return# 4. カメラパラメータの取得width, height = c_uint32(), c_uint32()puclib.PUC_GetResolution(h_device, byref(width), byref(height))w, h = width.value, height.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} ピクセル")# 5. バッファの確保comp_buffer = (c_ubyte * xfer_data_size.value)()line_bytes = (w + 3) & ~3 # 4バイト境界アラインメントdecoded_buffer = (c_ubyte * (line_bytes * h))()# 6. キャプチャの実行(外部トリガー信号の入力待ち)xfer_info = PUC_XFER_DATA_INFO()xfer_info.pData = comp_bufferxfer_info.nDataSize = xfer_data_size.valueprint("\n外部トリガー信号 (SYNC IN) の入力を待機中...")print("※外部機器から信号が入力されると撮影が実行されます。")ret_xfer = puclib.PUC_GetSingleXferData(h_device, byref(xfer_info))if ret_xfer == PUC_SUCCEEDED:print("トリガー信号を受信しました。復号処理を実行中...")# 7. 復号処理ret_dec = puclib.PUC_DecodeData(decoded_buffer, 0, 0, w, h, line_bytes, comp_buffer, q_vals)if ret_dec == PUC_SUCCEEDED:# 8. NumPy 配列化img_np = np.ctypeslib.as_array(decoded_buffer).reshape((h, line_bytes))[:, :w]# 9. PGM ファイルとして保存filename = "external_sync_captured.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_dec}")else:print(f"エラー: トリガー待機中にエラーが発生したか、タイムアウトしました。ErrorCode: {ret_xfer}")# 10. クローズ処理(モードを内部同期に戻してクローズ)puclib.PUC_SetSyncInMode(h_device, PUC_SYNC_IN_OFF, 0)puclib.PUC_CloseDevice(h_device)if __name__ == "__main__":main() -
スクリプトの実行
Terminal window python gbe2_external_sync.py外部機器からパルス信号が入力されると 1 フレームキャプチャが実行され、
external_sync_captured.pgmとして保存されます。
外部同期撮影のポイント
Section titled “外部同期撮影のポイント”1. PUC_SetSyncInMode による動作モード切替
Section titled “1. PUC_SetSyncInMode による動作モード切替”PUC_SetSyncInMode に 1 をセットすると、カメラは内部クロックによる連続露光を停止し、外部コネクタ (SYNC IN) からパルス信号が入力されたタイミングでのみフレームをキャプチャ・転送するモードに切り替わります。
2. トリガー未入力時のタイムアウト
Section titled “2. トリガー未入力時のタイムアウト”外部トリガー信号が一定時間入力されない場合、PUC_GetSingleXferData はブロック(応答待ち)された状態になるか、タイムアウトエラーを返します。プログラム終了前には、設定を PUC_SYNC_IN_OFF(内部同期)に戻してからクローズする処理を入れておくと安全です。
