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ライブラリ