コンテンツにスキップ
ステージングサーバー
開発サーバー

Pythonプログラマーズガイド#

このトピックでは、Basler blazeおよびSmart blazeカメラに特有の情報について説明しており、pypylonの包括的な概要を提供することを目的としたものではありません。

Basler pylonの公式Python言語バインディングは、pypylonプロジェクトです。pypylonはGitHubでホストされているオープンソースプロジェクトです。Basler 3Dカメラを使用するには、バージョン4.0以降を使用する必要があります。

公式のPythonラッパーの代替として、PythonのHarvesterライブラリを介してカメラを操作することが可能です。Harvesterは、コンピュータービジョンアプリケーションにおける画像取得プロセスを簡素化するように設計されたPythonライブラリです。GenTL Producerを介した画像取得を可能にします。

情報

このトピックのすべての情報は、すべてのblazeおよびSmart blazeカメラモデルに適用されます。簡潔にするため、すべてのモデルを指して「blaze」を使用しています。

pypylon#

pypylonのインストール#

Pythonプログラミングサンプル#

pylon Supplementary Package for blazeには、Pythonとpypylonを使用してblazeカメラにアクセスする方法を示すいくつかのPythonプログラミングサンプルが含まれています。

To open the folder containing the programming samples for blaze cameras, press the Win key, go to the Basler folder, and choose blaze Samples. A File Explorer window opens. The Python programming samples are located in the Python folder.

The Python samples are located in the /opt/pylon/share/pylon/Samples/blaze/Python/pypylon folder.

情報

サンプルをビルドする前に、サンプルを含むフォルダーを書き込み権限のある任意の場所にコピーします。

各サンプルには、サンプルの動作内容と実行要件に関する情報を提供するREADME.mdファイルがあります。

pypylonを使用したblazeカメラへのアクセス#

SimpleGrab/simple_grab.pyを参照するか、次のスニペットを使用します:

from pypylon import pylon

dc = pylon.DeviceInfo()
dc.SetDeviceClass("BaslerGTC/Basler/GenTL_Producer_for_Basler_blaze_101_cameras")
camera = pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateFirstDevice(dc))
camera.Open()

camera.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)

while camera.IsGrabbing():
    grabResult = camera.RetrieveResult(1000, pylon.TimeoutHandling_ThrowException)

    if grabResult.GrabSucceeded():
        pylonDataContainer = grabResult.GetDataContainer()

        for componentIndex in range(pylonDataContainer.DataComponentCount):

            pylonDataComponent = pylonDataContainer.GetDataComponent(componentIndex)
            if pylonDataComponent.ComponentType == pylon.ComponentType_Intensity:
                intensity = pylonDataComponent.Array
                _2d_intensity = intensity.reshape(pylonDataComponent.Height, pylonDataComponent.Width)

            pylonDataComponent.Release()

    grabResult.Release()

camera.StopGrabbing()

Harvester#

Harvesterのインストール#

コマンドラインで次のコマンドを実行します:

pip3 install harvesters

Python Harvesterプログラミングサンプル#

pylon Supplementary Package for blazeには、PythonとHarvesterを使用してblazeカメラにアクセスする方法を示すいくつかのPythonプログラミングサンプルが含まれています。

To open the folder containing the programming samples for blaze cameras, press the Win key, go to the Basler folder, and choose blaze Samples. A File Explorer window opens. The Python programming samples are located in the Python folder.

The Python Harvester samples are located in the /opt/pylon/share/pylon/Samples/blaze/Python/Harvester folder.

情報

サンプルをビルドする前に、サンプルを含むフォルダーを書き込み権限のある任意の場所にコピーします。

各サンプルには、サンプルの動作内容と実行要件に関する情報を提供するREADME.mdファイルがあります。

Linux

pylon Software Suiteおよびpylon Supplementary Package for blazeを/opt/pylon以外の場所にインストールした場合は、Harvesterがblazeカメラ用GenTL Producerを読み込むパスを調整する必要があります。

サンプルコードで次を検索し: /opt/pylon/lib/gentlproducer/gtl パスを調整します。

Harvesterを使用したblazeカメラへのアクセス#

Harvesterを使用して利用可能なすべてのblazeカメラを検出するには、次の手順を実行します。

  1. Harvesterモジュールをインポートします。
    from harvesters.core import Harvester
    
  2. Harvesterオブジェクトをインスタンス化します。
    h = Harvester()
    
  3. blazeカメラ用のGenTL Producerをロードします。

    h.add_file(r"C:\Program Files\Basler\pylon\Runtime\x64\ProducerBaslerBlazePylon.cti")
    
    h.add_file("/opt/pylon/lib/gentlproducer/gtl/ProducerBaslerBlazePylon.cti")
    
  4. 利用可能なデバイスのリストを更新します。

    h.update()
    

  5. 利用可能なデバイスに関する情報を取得します。
    h.device_info_list
    

カメラに接続するには、次を使用します: h.create() 関数と直接組み合わせて使用できます。

次のステートメントで、最初に見つかったblazeカメラに接続します:

ia = h.create(0)

特定のカメラを開くには、次のオブジェクトが提供するPropertyを使用して指定できます: device_info_list HarvesterクラスオブジェクトのProperty。

例:

ia = h.create(serial_number='9032635')

指定子は、開くデバイスを一意に特定する必要があることに注意してください。複数のカメラが条件に一致する場合、デバイスを開くことはできません。

カメラとの接続を切断するには、次のコマンドを実行します:

ia.destroy()

カメラパラメータへのアクセス#

カメラパラメータには、イメージアクワイアラーの remote_device Propertyを介してアクセスできます。リモートデバイスの node_map Propertyを使用すると、すべてのカメラパラメータにアクセスできます。

例:

# Get a parameter.
operatingMode = ia.remote_device.node_map.OperatingMode.value
# Set a parameter.
ia.remote_device.node_map.OperatingMode.value = 'ShortRange'

利用可能なすべてのカメラパラメータのリストを取得するには、次のコマンドを使用します:

dir(ia.remote_device.node_map)

blazeカメラパラメータの設定および取得のその他の例については、SimpleGrab sampleを参照してください。

データの取得#

情報

HarvesterはGenICam GenDCストリーミングフォーマットをサポートしていないため、データを取得する前に必ずGenDCストリーミングフォーマットを無効にする必要があります。GenDCストリーミングフォーマットを無効にするには、次のコマンドを使用します:

ia.remote_device.node_map.GenDCStreamingMode.value = "Off"

blazeカメラから取得したバッファには、複数のコンポーネントを含めることができます。Range、Intensity、Confidenceの各コンポーネントがあります。

次のコードスニペットは、利用可能なすべてのコンポーネントを有効にし、深度データが点群(ポイントクラウド)として提供されるようにRangeコンポーネントのPixel Formatを設定します。点群では、x、y、z座標のトリプルが各センサーピクセルに割り当てられます。

ia.remote_device.node_map.ComponentSelector.value = "Range"
ia.remote_device.node_map.ComponentEnable.value = True
ia.remote_device.node_map.PixelFormat.value = "Coord3D_ABC32f"

ia.remote_device.node_map.ComponentSelector.value = "Intensity"
ia.remote_device.node_map.ComponentEnable.value = True
ia.remote_device.node_map.PixelFormat.value = "Mono16"

ia.remote_device.node_map.ComponentSelector.value = "Confidence"
ia.remote_device.node_map.ComponentEnable.value = True
ia.remote_device.node_map.PixelFormat.value = "Confidence16"

点群の代わりに深度マップを使用する場合は、Rangeコンポーネントを次のように設定します:

ia.remote_device.node_map.ComponentSelector.value = "Range"
ia.remote_device.node_map.ComponentEnable.value = True
ia.remote_device.node_map.PixelFormat.value = "Coord3D_C16"

取り込みを開始するには、イメージアクワイアラーの start() 関数:

ia.start()

一般的な取得ループは次のようになります:

ia.start()
while True:
    with ia.fetch() as buffer:
        # Do something with the buffer.
ia.stop()

情報

バッファは with ステートメント内でのみ有効であり、スコープを抜けると破棄されます。バッファを次の外部で使用する場合は、 with スコープでは、以下を使用する必要があります np.copy() ディープコピーを作成するには。

次のコードスニペットは、バッファのコンポーネントにアクセスする方法を示しています。

with ia.fetch() as buffer:
      depth = buffer.payload.components[0]
      intensity = buffer.payload.components[1]
      confidence = buffer.payload.components[2]

Harvesterは、コンポーネントを1次元のNumPy配列として返します。

以降の処理のために、1D配列を2Dまたは3D配列に再形状(リシェープ)すると便利な場合があります。

depth_arr = depth.data.reshape(pointcloud.height, pointcloud.width,
                              int(pointcloud.num_components_per_pixel))

intenstiy_arr = intensity.data.reshape(intensity.height, intensity.width)

confidence_arr = confidence.data.reshape(confidence.height, confidence.width)

num_components_per_pixel は、RangeコンポーネントのPixel Formatによって異なります。Pixel Formatが次と等しい場合 Coord3D_ABC32f、Rangeコンポーネントは点群(ポイントクラウド)として表現されます。つまり、各ピクセルに対して3つのfloat値が存在します。その結果、各ピクセルのx、y、z座標を格納する3次元配列が得られます。

Pixel Formatが次と等しい場合 Coord3D_C16、Rangeコンポーネントは16ビットのグレースケール画像として表現されます。つまり、各ピクセルに対して1つの16ビット整数値が存在します。

深度マップの階調値をmmに変換する方法の詳細については、Processing Measurement Resultsトピックを参照してください。

データの取得が完了したら、以下を呼び出します stop() 関数:

ia.stop()

上記のようなグラブループを実装する代わりに、Harvesterはグラブループを実装し、コールバックを発行してアプリケーションに通知するバックグラウンドスレッドを提供できます。このアプローチは、SimpleGrab_Callback サンプルに示されています。

アプリケーションのデバッグとGigE Visionハートビートの制御#

blazeカメラのようなGigE Visionカメラでは、カメラに特別なネットワークパケットを定期的に送信して、アプリケーションが定期的にカメラにアクセスする必要があります。カメラがこれらのハートビートを受信しない場合、接続が切断されたと見なされ、アプリケーションからのコマンドを受け付けなくなります。

アプリケーションを実行すると、blazeカメラ用のGenTL Producerが通常これらのハートビートを生成します。アプリケーションにブレークポイントを設定してそのブレークポイントヒットすると、デバッガはハートビートを送信しているスレッドを含むすべてのスレッドを一時停止します。そのため、アプリケーションのデバッグ中やコードのステップ実行中は、カメラにハートビートが送信されません。その結果、カメラはハートビートのタイムアウトを検出し、接続を閉じます。ハートビートタイムアウトのデフォルト値は3000ミリ秒です。

これを回避するには、開発中にハートビートタイムアウトを増やす必要があります。これを行うには、次の環境変数を設定します GEV_HEARTBEAT_TIMEOUT そして、希望するタイムアウトをミリ秒単位で指定します。

または、次のようにアプリケーションでハートビートタイムアウトを設定することもできます。

ia.device.node_map.HeartbeatTimeout.value=600000

情報

ハートビートタイムアウトを高い値に設定し、デバイスを適切に閉じずにアプリケーションを停止すると、カメラを再度開くことができなくなり、デバイスが現在使用中であるというエラーを受け取ります。これは、デバッガを使用してアプリケーションを停止した場合や、アプリケーションが予期せず終了した場合に発生する可能性があります。カメラを再度開くには、タイムアウトが経過するまで待つか、カメラからネットワークケーブルを抜く必要があります。