Python

eGrabberはPythonで使用することもできます。

インストール

eGrabber用のPythonバインディングは、eGrabberがインストールされたディレクトリ1pythonサブディレクトリにあるPython wheelインストールパッケージ(.whlファイル)に含まれています。Pythonの設定にもよりますが、次のような簡単なコマンドでインストールできます。

            python -m pip install <PATH_TO_EGRABBER_WHL>
        

最初の例

この例では、グラバーを作成し、それに含まれるインターフェース、デバイス、およびリモートデバイスモジュールに関する基本情報を表示します。これは、C++言語によるeGrabberの例をPythonバージョンに書き換えたものです。

                from egrabber import *                                  # 1
card_ix = 0
device_ix = 0
def showInfo():
    gentl = EGenTL()                                    # 2
    grabber = EGrabber(gentl, card_ix, device_ix)       # 3
    card = grabber.interface.get('InterfaceID')         # 4
    dev = grabber.device.get('DeviceID')                # 5
    width = grabber.remote.get('Width')                 # 6
    height = grabber.remote.get('Height')               # 6
    print('Interface:    %s' % card)
    print('Device:       %s' % dev)
    print('Resolution:   %ix%i' % (width, height))
try:                                                    # 7
    showInfo()
except Exception as e:                                  # 7
    print('error: %s' % e)
            
1. egrabberモジュールをインポートします。
2. EGenTLオブジェクトを作成します。このオブジェクトによって、GenTLプロデューサー(coaxlink.ctiなど)の場所を特定して開き、それを初期化します。
3. EGrabberオブジェクトを作成します。コンストラクターには、手順2で作成されたgentlオブジェクトが必要です。また、使用するインターフェースとデバイスのインデックスも、オプションの引数として取ります。
4. GenApiを使用し、CoaxlinkカードのIDを調べます。インターフェースモジュールからの返答が必要であるため、grabber.interfacegetを実行します。
5. 同様に、デバイスのIDを調べます。今回は、grabber.deviceを使用してデバイスモジュールをターゲットにします。
6. 最後に、カメラの解像度を読み取りますが、今回は、カメラから値を取得必要があるため、grabber.remoteを使用します。
7. egrabberは、エラーを報告するために例外処理を用いるため、try: ... except: ...ブロック内のコードをラップします。

プログラムの出力例:

                    Interface:    PC1633 - Coaxlink Quad G3 (2-camera) - KQG00014
Device:       Device0
Resolution:   4096x4096
                

9.3 C++とPythonのeGrabberの違い

eGrabberクラス

C++ Python
EGrabber<> EGrabber
EGrabber<CallbackOnDemand> EGrabber
EGrabber<CallbackSingleThread> -
EGrabber<CallbackMultiThread> -
Buffer Buffer
ScopedBuffer withブロックで使用されるBuffer

EGrabberメソッド

メソッド名は、C++ APIではcamelCaseのように記述されますが、Pythonではlower_caseのように記述されます。たとえば、C++でreallocBuffersと記述されるメソッドは、Pythonではrealloc_buffersと記述されます。
コールバック関数によるイベント通知は、eGrabberの現在のPythonバインディングでは利用できません。
その他、次のような違いがあります。
C++ Python
getInteger<MODULE>(f) MODULE.get(f, dtype=int)
getFloat<MODULE>(f) MODULE.get(f, dtype=float)
getString<MODULE>(f) MODULE.get(f, dtype=str)
getStringList<MODULE>(f) MODULE.get(f, dtype=list)
- MODULE.get(f, dtype=bool)
- MODULE.get(f)
setInteger<MODULE>(f, v) MODULE.set(f, v)
setFloat<MODULE>(f, v) MODULE.set(f, v)
setString<MODULE>(f, v) MODULE.set(f, v)
execute<MODULE>(f) MODULE.execute(f)

MODULEは、systeminterfacedevicestream、またはremoteに置き換えられます。