Documentation Portal      

何をお探しですか?

画像の取得

このプログラムは、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 コンストラクタは出力キューの先頭からバッファをポップします(すなわち、最も古いバッファをとります)。
ScopedBuffer デストラクタはそのバッファを入力キューの後ろにプッシュします(したがって、このバッファはすでに入力キューにあるすべてのバッファの後に新しい転送に使用されます)。

© 2019 EURESYS s.a.  -  このドキュメントについて  -  Coaxlink 11.0.3。2077