コンテンツにスキップ
ステージングサーバー
開発サーバー

クイックスタート#

このトピックでは、簡単なワークフローを通じて pypylon の最初の手順について説明します。

動作するコードを示すことだけでなく、サンプルコードをより複雑なシナリオで再利用および適合させる方法を理解してもらうことも目的としています。

ステップバイステップの例#

最も単純な形式において、pypylon を使用した画像取得には次の手順が含まれます。

  • カメラの検出
  • カメラを開く
  • 画像取得の開始
  • 画像の取得
  • 画像の処理

次の例は、これらの手順を示しています。また、次の追加の利点があります。

  • インストールが正常に機能していることを確認できます。
  • カメラの接続性をテストできます。
  • 取得のライフサイクルを理解するのに役立ちます。

例:

from pypylon import pylon

with pylon.InstantCamera(pylon.FirstFound) as camera:
    camera.StartGrabbingMax(1)

    with camera.RetrieveResult(5000) as grab_result:
        if grab_result.GrabSucceeded():
            image = grab_result.Array
            print(image.shape)

このサンプルを個々のステップに分解してみましょう。

  1. カメラの作成と管理

    with pylon.InstantCamera(pylon.FirstFound) as camera:
    

    この行では、2つの重要な処理が行われます。

    • これは 利用可能な最初のカメラを選択し、トランスポートレイヤーファクトリを使用して pylon デバイスオブジェクトを作成し、それを使いやすいように InstantCamera オブジェクトでラップします。
    • を使用して、 with エラーが発生した場合でも、リソースが自動的に解放され、カメラが適切に閉じられるようにします。
  2. 取得の開始

    camera.StartGrabbingMax(1)
    

    これにより、カメラがまだ開いていない場合は開き、取得エンジンが開始され、カメラに次の動作を実行するように指示されます。

    • 正確に 1 フレームを取得します。
    • その後、撮像を停止します。

    これは無限ループを回避できるため、テストに最適です。

    また、Openを呼び出して事前にカメラを開くこともできます。

    camera.Open()
    

    接続を開くことで、次のタスクに向けてカメラの準備が整います。

    • パラメータの設定
    • 取得の開始
  3. グラブ結果の取得

    with camera.RetrieveResult(5000) as grab_result:
    

    この呼び出しは、以下のいずれかのイベントが発生するまでブロックします。

    • フレームが利用可能です。
      または
    • タイムアウト(5000 ms)に達しました。

    内部的には、バッファキューから画像を取得しています。

  4. グラブの検証

    if grab_result.GrabSucceeded():
    

    グラブ結果が返された場合でも、取り込みが失敗している可能性があります(転送エラーなど)。データを使用する前に、必ず成功したかどうかを確認してください。

  5. ピクセルデータのコピーの作成(オプション)

    グラブ結果は、バッファプールのバッファを使用します。アクセス時 grab_result.Arrayでは、グラブ結果バッファデータのコピーを取得できます。または、 GetMemoryView() または GetArrayZeroCopy() を使用して、コピーせずにデータにアクセスすることもできます。

    グラブ結果のバッファは、 with ブロックを抜けると無効になります。これは、 grab_result が解放されるためです。ピクセルデータを with ブロックの外で使用するには、そのコピーを作成する必要があります。 Array 関数を使用して、ピクセルデータのコピーを作成できます。

    image = grab_result.Array
    
  6. 画像の使用

    print(image.shape)
    

    これにより、以下のことが確認されます。

    • 画像が存在していること。
    • データが有効な形状を持っていること。

インタラクティブな GigE セッション向けの ConnectionGuard の有効化#

デバッガーからGigEカメラを開くと、pylonは自動的に ConnectionGuardEnable 以下の前で Open()を有効にします。これにより、次の2つの処理が行われます。

  • カメラが予期せず再起動しないように、ハートビートのタイムアウトが60分に延長されます。
  • プログラムが突然停止した場合でも、接続が正常に閉じられます。

明示的に設定する場合は、カメラを開く前に行ってください。

from pypylon import pylon

with pylon.InstantCamera() as camera:
    camera.Attach(pylon.FirstFound)
    camera.TLNodeMap.ConnectionGuardEnable.Value = True
    camera.Open()

これは、デバッガーセッション外でも同じ動作にしたい場合に便利です。

メンタルモデル#

この視覚図は、内部で何が起こっているかを示しています。

Camera (hardware)
      ↓
pylon driver + buffers
      ↓
Transport layer (USB/GigE)
      ↓
RetrieveResult()
      ↓
NumPy array (your application)

重要なポイント:

  • カメラは非同期で動作し(フレームを生成します)、
  • ユーザーのPythonコードは同期してフレームを消費します。

バッファがその間に配置され、両方の世界(カメラとアプリケーション)を分離します。

主なポイント#

  • 必ず確認してください: GrabSucceeded().
  • 結果スコープから抜ける前、またはグラブ結果を解放する前に、例えば次を使用して、常に画像データをコピーしてください: Array 関数と直接組み合わせて使用できます。
  • 使用 StartGrabbingMax(1) 簡単なテスト用。または、次を使用することもできます: GrabOne(5000).
    StartGrabbingMax(1) 画像を正確に1枚グラブします。 GrabOne(5000) 画像を1枚グラブしますが、5000 µs後にタイムアウトします。
  • 使用 with 安全なリソース管理を確保するため。

このパターンを理解したら、それを基にして次のタスク用のコードを作成できます: