画像の取得
このプログラムは、Coaxlinkカードに接続されたカメラから Euresys::EGrabber
を使用して画像を取得します。
#include <iostream>
#include <EGrabber.h>
void grab() {
Euresys::EGenTL gentl;
Euresys::EGrabber<> grabber(gentl); // 1
grabber.reallocBuffers(3); // 2
grabber.start(10); // 3
for (size_t i = 0; i < 10; ++i) {
Euresys::ScopedBuffer buf(grabber); // 4
void *ptr = buf.getInfo<void *>(GenTL::BUFFER_INFO_BASE); // 5
uint64_t ts = buf.getInfo<uint64_t>(GenTL::BUFFER_INFO_TIMESTAMP); // 6
std::cout << "buffer address: " << ptr << ", timestamp: "
<< ts << " us" << std::endl;
} // 7
}
int main() {
try {
grab();
} catch (const std::exception &e) {
std::cout << "error: " << e.what() << std::endl;
}
}
|
1.
|
キャリブレータ Euresys::EGrabber オブジェクトを作成。 コンストラクタの2番目と3番目の引数はここでは省略されています。 グラバーは、システムに存在する最初のインターフェースの最初のデバイスを使用します。 |
|
2.
|
3つのバッファを割り当てます。 グラバーは自動的に必要なバッファサイズを決定します。 |
|
3.
|
グラバーを開始します。 ここでは、グラバーに10個のバッファを埋めてください。 グラバーが特定数のバッファーの後で停止したくない場合は、 grabber.start(GenTL::GENTL_INFINITE) 、または単に grabber.start() を実行できます。 グラバーを起動するには、次の操作が必要です: | ● | カメラで AcquisitionStart コマンドが実行されます; |
| ● | DSStartAcquisition 関数はデータストリームを開始するために呼び出されます。 |
この例では、カメラとフレームグラバーが正しく設定されていると仮定しています。 実際のアプリケーションでは、集録を開始する前(そしてそのことに関するバッファを割り当てる前)に configuration script を実行した方が安全です。 これは別例でも示します。 |
|
4.
|
グラバーでいっぱいになるまでバッファーを待ちます。 結果は Euresys::ScopedBuffer 。 スコープ という用語は、バッファの存続期間が現在のスコープ(つまり、現在のブロック)であることを示すために使用されます。 |
|
5.
|
バッファアドレスを取得します。 これはバッファの getInfo メソッドを呼び出すことによって行われます。 このメソッドは引数として BUFFER_INFO_CMD をとります。 この場合は、標準の GenTL header fileに定義されている BUFFER_INFO_BASE を要求します:
enum BUFFER_INFO_CMD_LIST
{
BUFFER_INFO_BASE = 0, /* PTR Base address of the buffer memory. */
BUFFER_INFO_SIZE = 1, /* SIZET Size of the buffer in bytes. */
BUFFER_INFO_USER_PTR = 2, /* PTR Private data pointer of the GenTL Consumer. */
BUFFER_INFO_TIMESTAMP = 3, /* UINT64 Timestamp the buffer was acquired. */
// ...
// other BUFFER_INFO definitions omitted
// ...
BUFFER_INFO_CUSTOM_ID = 1000 /* Starting value for GenTL Producer custom IDs. */
};
typedef int32_t BUFFER_INFO_CMD;
getInfo はテンプレートメソッドであることに注意してください。それを呼び出すときに、期待する値の型を指定する必要があります。 BUFFER_INFO_BASE はポインタを返します;これが getInfo<void *> を使う理由です。
|
|
6.
|
バッファのタイムスタンプを取得するために同じことを行います。 今回は、 BUFFER_INFO_TIMESTAMP のタイプに合わせて getInfo バージョンの uint64_t を使用します。 |
注記: Coaxlinkの場合、タイムスタンプは常に64ビットで、コンピュータの起動後に経過したマイクロ秒数として表されます。
|
7.
|
私たちは for ブロックの終わりに到達します。 ローカル変数 buf が範囲外になり、破棄されます: ScopedBuffer デストラクタが呼び出されます。 これにより、 buf に含まれているGenTLバッファーがグラバーのデータストリームに再度キューイングされます(戻されます)。 |
プログラム出力例
buffer address: 0x7f3c32c54010, timestamp: 11247531003686 us
buffer address: 0x7f3c2c4bf010, timestamp: 11247531058080 us
buffer address: 0x7f3c2c37e010, timestamp: 11247531085003 us
buffer address: 0x7f3c32c54010, timestamp: 11247531111944 us
buffer address: 0x7f3c2c4bf010, timestamp: 11247531137956 us
buffer address: 0x7f3c2c37e010, timestamp: 11247531163306 us
buffer address: 0x7f3c32c54010, timestamp: 11247531188600 us
buffer address: 0x7f3c2c4bf010, timestamp: 11247531213807 us
buffer address: 0x7f3c2c37e010, timestamp: 11247531239158 us
buffer address: 0x7f3c32c54010, timestamp: 11247531265053 us
割り当てられた3つのバッファ( 0x7f3c32c54010
をA、 0x7f3c2c4bf010
をB、 0x7f3c2c37e010
をCと呼びます)がラウンドロビン方式で使用されていることがわかります。A→B→C→A→B→C→.. これは次の結果からになります:
|
●
|
入力および出力バッファキューのFIFOの性質: |
|
□
|
Coaxlinkドライバは入力キューの先頭からバッファをポップし、それをDMA転送のためにCoaxlinkカードに渡します; |
|
□
|
転送が完了すると、バッファは出力キューの最後にプッシュされます; |
|
□
|
ScopedBuffer コンストラクタは出力キューの先頭からバッファをポップします(すなわち、最も古いバッファをとります)。 |
|
□
|
ScopedBuffer デストラクタはそのバッファを入力キューの後ろにプッシュします(したがって、このバッファはすでに入力キューにあるすべてのバッファの後に新しい転送に使用されます)。 |
Euresysのドキュメントについて
このドキュメントは、バージョン44のGoogle Chrome、バージョン20のMicrosoft Edge向けに最適化されています。
適切に表示するにはJavascriptが必要です。 ブラウザでアクティブなスクリプトを有効にする必要があります。
推奨される画面解像度は、少なくとも1280 x 1024です。
本書はCoaxlink 11.0 (doc build ) とともに提供されます。2077
利用規約
EURESYS s.a. は、ハードウェアおよびソフトウェアのドキュメントおよび EURESYS s.a. の商標のあらゆる所有権、権原および権益を留保します。
本書に記載されているすべての会社名および製品名は、各所有者の商標である可能性があります。
EURESYS s.a. のハードウェアまたはソフトウェア、ブランドまたは本書に含まれるドキュメントのライセンス供与、使用、リース、貸し出し、翻訳、複製、複写または変更は、 事前の通知なく許可されていません。
EURESYS s.a. は、随時、自由裁量で、事前の通知なく製品の仕様を変更したり、本書に記載されている情報を変更することができます。
EURESYS s.a. は、EURESYS s.a. のハードウェアまたはソフトウェアの使用に関連して発生した、または本書での欠落または誤りの結果生じた、収入、利益、営業権、データ、情報システムのいかなる損失または損害、またはその他のあらゆる種類の特別な、偶発的な、間接的な、派生的な、または懲罰的な損害に対し 一切の責任を負いません。