画像の一般的な取得

カメラ取得スレッド

Aurora Visionでは、画像の取得はバックグラウンドで行われます。そのため、ビジョンプログラムが何をしているかに関係なく、新しい画像はできるだけ早くカメラから受信できます。

カメラとの通信が開始されると(たとえば、GigEVision_StartAcquisitionを使用して)、Aurora Visionは特別なバックグラウンドスレッドを作成します。このスレッドはその特定のカメラとのすべての通信を処理し、受信した画像は特別なキューに保存されます。厳密には同じではありませんが、原則としてそのキューはAurora Visionのユーザーに利用可能なキューと類似しています。キューのサイズはフィルタによって決まります(一部のカメラインターフェースは1より大きなサイズをサポートしていない場合があります)。

プログラムがグラビングフィルタを実行すると(たとえば、GigEVision_GrabImage:Synchronous)、そのフィルタは実際にはバックグラウンド取得スレッドによって作成されたキューから画像を取得し、直接カメラからではありません。

キューに画像がない場合、グラビングフィルタは新しい画像が到着するまで待機します。これは無期限の時間(同期バリアント)または指定された時間(非同期バリアント)のいずれかです。この動作は、フィルタQueue_PopおよびQueue_Pop_Timeoutがそれぞれ同様に動作する方法と同様です。画像を取得した後、それはキューから削除されます。キューがいっぱいでカメラが新しい画像を送信した場合、キュー内の最も古い画像が置き換えられます。

画像はキューに残りますが、それらは取得されたり、より新しい画像に置き換えられたり、そのカメラスレッドが閉じられたりするまでです。

重要なことは、キューサイズが1より大きい場合、グラビングフィルタが利用可能な最も古い画像を返すということです。アプリケーション構造に応じて、これが望ましいかどうかは異なります。

  • アプリケーションがすべての画像を分析する必要があるが、反復時間が画像間の期間よりも長い場合、キューのサイズはアプリケーションが追いつくまでのすべての画像を格納できるだけ大きくする必要があります。たとえば、カメラがバーストで複数回トリガーされ、その後非アクティブな期間が続く場合、キューサイズは1バースト中のトリガーの数と等しくする必要があります。
  • 逆に、アプリケーションがすべての画像を検査する必要がない場合(自由に動作するカメラを備えたアプリケーションで一般的)、キューサイズは通常1に制限できます。これにより、画像取得と結果の間の最小の遅延が確保されます。

前述のように、バックグラウンドカメラスレッドはその割り当てられたカメラとのすべての通信を処理します。指定されたカメラのスレッドが存在しない場合、カメラフィルタが使用されるとすぐに作成されます。カメラには1つのスレッドしか割り当てることができないため、スレッドが利用可能な場合は常に既存のスレッドをフィルタが使用します。

カメラスレッドはまた、パラメータの設定と読み取りも処理します。カメラインターフェースによっては、値が変更された場合にのみ新しいパラメータ値を書き込むなどの最適化があるかもしれません。

重要なのは、スレッドが作成されたタスクが終了すると、スレッドが閉じられるということです。スレッドが閉じられると、それに含まれるすべてのデータ(キュー内の画像を含む)が削除されます。