クイックスタート#
動作するコードを示すことだけでなく、サンプルコードをより複雑なシナリオで再利用および適合させる方法を理解してもらうことも目的としています。
ステップバイステップの例#
最も単純な形式において、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)
このサンプルを個々のステップに分解してみましょう。
-
カメラの作成と管理
この行では、2つの重要な処理が行われます。
- これは 利用可能な最初のカメラを選択し、トランスポートレイヤーファクトリを使用して pylon デバイスオブジェクトを作成し、それを使いやすいように
InstantCameraオブジェクトでラップします。 - を使用して、
withエラーが発生した場合でも、リソースが自動的に解放され、カメラが適切に閉じられるようにします。
- これは 利用可能な最初のカメラを選択し、トランスポートレイヤーファクトリを使用して pylon デバイスオブジェクトを作成し、それを使いやすいように
-
取得の開始
これにより、カメラがまだ開いていない場合は開き、取得エンジンが開始され、カメラに次の動作を実行するように指示されます。
- 正確に 1 フレームを取得します。
- その後、撮像を停止します。
これは無限ループを回避できるため、テストに最適です。
また、Openを呼び出して事前にカメラを開くこともできます。
接続を開くことで、次のタスクに向けてカメラの準備が整います。
- パラメータの設定
- 取得の開始
-
グラブ結果の取得
この呼び出しは、以下のいずれかのイベントが発生するまでブロックします。
- フレームが利用可能です。
または - タイムアウト(5000 ms)に達しました。
内部的には、バッファキューから画像を取得しています。
- フレームが利用可能です。
-
グラブの検証
グラブ結果が返された場合でも、取り込みが失敗している可能性があります(転送エラーなど)。データを使用する前に、必ず成功したかどうかを確認してください。
-
ピクセルデータのコピーの作成(オプション)
グラブ結果は、バッファプールのバッファを使用します。アクセス時
grab_result.Arrayでは、グラブ結果バッファデータのコピーを取得できます。または、GetMemoryView()またはGetArrayZeroCopy()を使用して、コピーせずにデータにアクセスすることもできます。グラブ結果のバッファは、
withブロックを抜けると無効になります。これは、grab_resultが解放されるためです。ピクセルデータをwithブロックの外で使用するには、そのコピーを作成する必要があります。Array関数を使用して、ピクセルデータのコピーを作成できます。 -
画像の使用
これにより、以下のことが確認されます。
- 画像が存在していること。
- データが有効な形状を持っていること。
インタラクティブな 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安全なリソース管理を確保するため。
このパターンを理解したら、それを基にして次のタスク用のコードを作成できます:
- 連続アクルージョンループの構築
- トリガーアクルージョンの設定
- マルチカメラセットアップの設計