GenTL
GenTLでは、親子関係で編成された次の5種類のオブジェクトが定義されます。
1. | システムモジュール |
2. | インターフェースモジュール |
3. | デバイスモジュール |
4. | データストリームモジュール |
5. | バッファモジュール |
モジュールには次の特性があります。
● | システムの特定の要素に対応します。 |
● | (get info関数を使用して)照会できる関連情報(infoコマンド)を定義します。 |
● | そのモジュールの機能を(特定の機能を使用して)実行することを許可します。 |
さらに、バッファモジュールを除くすべてのモジュールは、読み書き演算を許可するポートとして動作します。GenApiはこれらのポートの関数を使用してモジュールの記述ファイルを読み込み、GenApiの機能に使用します。
システムモジュール
システムモジュール(TLSystem)はGenTLプロデューサー(coaxlink.ctiライブラリなど)です。親子ツリーの最上位にあります。
システムモジュールは、CTIファイルの完全パスやベンダー名(Euresys)といった、GenTLプロデューサーに関する基本情報を提供します。
システムモジュールの本来の目的は、システムに存在するインターフェース(またはフレームグラバー)を一覧表示することです。システムモジュールの最も重要な機能は、TLGetNumInterfaces(システム内のフレームグラバーの数を取得するため)とTLOpenInterface(フレームグラバーの1つにアクセスするため)です。
GenTL規格ではフレームグラバーをインターフェースと呼んでいます。システムモジュールには、フレームグラバーごとに1つの子インターフェースがあります。コンピューターにCoaxlinkカードが2つある場合、システムモジュールの子インターフェース数も2となります。
各インターフェースはフレームグラバーを表します。デジタルI/Oラインなどのグローバルフレームグラバー機能は、インターフェースモジュールに属します。I/Oラインを制御するGenApi機能はこのインターフェースに紐づけられています。
各インターフェースは、1つ以上の デバイスの親としても機能します。インターフェースモジュールの最も重要な関数は、IFGetNumDevices(インターフェースに接続できるカメラの数を取得するため)とIFOpenDevice(デバイスの1つにアクセスするため)です。
GenTL規格では、関連性のある2つの異なる概念でデバイスという用語とリモートデバイスという用語を使用しています。リモートデバイスは、フレームグラバーに物理的に接続されている実際のカメラを指し、ここで説明するデバイスモジュールとは異なります。
デバイスモジュールは、カメラに関連するフレームグラバー設定を含むモジュールです。トリガーやストロボなどが含まれます。
デバイスモジュールは、1つ以上のデータストリームの親としても機能し、 リモートデバイスの兄弟とみなすこともできます。デバイスモジュールの最も重要な関数は、DevOpenDataStream(データストリームの1つにアクセスするため)とDevGetPort(リモートデバイスにアクセスするため)です。
データストリームモジュールはバッファを処理します。取得が実行されている間、画像はカメラからフレームグラバーに送信されますが、フレームグラバーに送信された画像は、ホストコンピューターに割り当てられたメモリバッファに転送されます。この画像の取り込みが発生するのがデータストリームモジュールです。機能のほとんどが存在する場所です。
バッファ処理には高い柔軟性が与えられています。任意の数のバッファを使用できます。バッファを入力キューまたは出力キューに入れたり、一時的にキューに入れられないようにすることができます。空のバッファが(入力FIFOの)キューに入れられるタイミングと、いっぱいになったバッファを(出力FIFOから)取得するタイミングは、アプリケーションによって決められます。
バッファモジュールは単に親データストリームに与えられるメモリバッファを表します。バッファには有用なメタデータが関連付けられます。画像の幅、高さ、ピクセル形式、タイムスタンプなどが含まれます。こういったデータを取得するには、infoコマンドを使用します(標準のGenTLヘッダーファイルに含まれる「BUFFER_INFO_CMD_LIST」の部分をご覧ください)。
バッファモジュールは、ポートの読み書き関数を持たない唯一のモジュールです。GenApiの機能はありません。
GenTL API
カメラとフレームグラバーの全機能を検出、制御、使用するには、GenTLを使うことができますが、その使い方はやや複雑です。
● | cti ファイルは動的に読み込まれる必要があり、それらがエクスポートする関数にはポインターを介してアクセスする必要があります。 |
● | また、関数が返すエラーコードはアプリケーションで検査する必要があります。 |
● | ほとんどの関数は型なしのバッファと読み書きを行うため、必要なバッファサイズの決定、一時バッファの割り当て、このバッファとのデータの変換、最後にバッファメモリの解放を、アプリケーション側で行う必要があります。 |
GenTL APIを直接使用するのではなく、以下のいずれかを使用することをお勧めします。
● | こういった複雑な作業をユーザーに代わって処理するEGenTL C++クラス |
● | 高レベルで使いやすいインターフェースを提供するeGrabberライブラリ |