画像の取得

このページでは、ビデオキャプチャデバイスからデータストリームを設定し、単一画像を取得する方法を詳しく説明します。

ビデオキャプチャデバイスのオープンと設定

最初に、ライブラリを初期化し、最初に利用可能なビデオキャプチャデバイスを開きます。

import imagingcontrol4 as ic4
ic4.Library.init()

# Create a Grabber object
grabber = ic4.Grabber()

# Open the first available video capture device
first_device_info = ic4.DeviceEnum.devices()[0]
grabber.device_open(first_device_info)

次に、デバイスを設定します。このステップは重要で、多くの場合、プログラムは動作開始前にカメラを所定の状態にしておく必要があります。 この例では、デバイスの PropId.WIDTHPropId.HEIGHT プロパティを使用して解像度を設定します。

# Set the resolution to 640x480
grabber.device_property_map.set_value(ic4.PropId.WIDTH, 640)
grabber.device_property_map.set_value(ic4.PropId.HEIGHT, 480)

この段階で、アプリケーションは準備済みのデバイス設定ファイルを Grabber.device_open_from_state() を使用して読み込んだり、PropertyMap.deserialize() を使ってシリアライズされたプロパティ設定を適用することもできます。

Sinkとデータストリームの設定

デバイスの設定が完了したら、次はデータストリームを設定します。ビデオキャプチャデバイスから画像データを受け取るためには、Sink オブジェクトを作成する必要があります。 SnapSink は、必要なタイミングで画像を取得する用途に最も適したSinkです。

# Create a SnapSink. A SnapSink allows grabbing single images (or image sequences) out of a data stream.
sink = ic4.SnapSink()
# Setup data stream from the video capture device to the sink and start image acquisition.
grabber.stream_setup(sink, setup_option=ic4.StreamSetupOption.ACQUISITION_START)

データストリームは、作成したSinkをパラメータとして Grabber.stream_setup() を呼び出すことで確立されます。また、setup_optionStreamSetupOption.ACQUISITION_START を設定することで、データストリーム作成後にデバイスが直ちに画像取得を開始するよう指示しています。

Grabber.stream_setup() が正常に終了すると、デバイスはホストコンピュータへ連続的に画像を送信し始めます。

画像の取得

SnapSink.snap_single() を呼び出すことで、Sinkは次に到着する画像を待機し、指定したタイムアウト期間内に画像を受信した場合、その画像を返します。

try:
    # Grab a single image out of the data stream.
    image = sink.snap_single(1000)

    # Print image information.
    print(f"Received an image. ImageType: {image.image_type}")

    # Save the image.
    image.save_as_bmp("test.bmp")

except ic4.IC4Exception as ex:
    print(ex.message)

この例では、受信した画像の情報を表示し、ビットマップファイルとして保存します。

SnapSink.snap_single()ImageBuffer.save_as_bmp() は、どちらも失敗する可能性があります。 そのため、エラー発生時にエラーメッセージを表示するため、コード全体を try..except ブロックで囲んでいます。

データストリームの停止

Grabber.stream_stop() を呼び出すと、データストリームが停止します。

# Stop the data stream.
grabber.stream_stop()

画像取得やデータストリームを停止することは重要です。取得を続けたままにすると、CPU やメモリのリソース、さらには伝送媒体の帯域幅を無駄に消費してしまいます。