Harvesterとの連携 -- カメラ画像取り込みとフィルタ処理


Harvester を用いてカメラから画像を取り込み、メディアンフィルタを適用して画像を保存するサンプルコードです。

本サンプルの実行には GenICam に対応したカメラデバイスが必要です。 また、予め Harvester と適切な GenTL Producer をインストールしておく必要があります。 Harvester は pip コマンドを使用する場合、次のようにインストールしてください。

pip install harvesters==1.4.2

GenTL Producer はカメラ製造元などから入手してインストールし、 サンプルコード中の変数 cti_file にインストールした CTI ファイルの場所を設定してください。

コード

import sys

from harvesters.core import Harvester
from genicam.gentl import TimeoutException
import pyfie

# 利便のため PyFIE 関数が返すエラーコードに応じて例外を発生させる機能を有効化
pyfie.ctrl.enable_f_err_exception(True)

# 取り込む画像の型の設定。8ビット濃淡画像とする
DATA_FORMAT = "Mono8"

# タイムアウト時間設定
TIMEOUT = 5

# GenTL Producer に対応する適切な Common Transport Interface (CTI) ファイルを設定。
# 本サンプルコードを動作させるには環境に応じてこの設定を適切に書き換える必要があります。
# 例えば Basler 社の pylon Camera Software Suite 7 の USB カメラ向けの
# Producer を Windows で使う場合は下記のように設定します。
# cti_file = r"C:\Program Files\Basler\pylon 7\Runtime\x64\ProducerU3V.cti"
cti_file = "..."

h = Harvester()

# CTIファイルを使用して利用可能なカメラデバイスの一覧を取得
h.add_file(cti_file)
h.update()

if len(h.device_info_list) == 0:
    print("カメラが見つかりません", file=sys.stderr)
    sys.exit(1)

# 最初のカメラデバイスのモデル名を表示
print(f"カメラ:{h.device_info_list[0].model}")

# 最初のカメラデバイスの所有権を獲得
ia = h.create(0)
# 取り込む画像のフォーマットを設定
ia.remote_device.node_map.PixelFormat.value = DATA_FORMAT
# 画像取り込みを開始
ia.start()

def capture_single_shot(image_acquirer):
    """ImageAcquirer オブジェクトから画像を1枚取り込み、 PyFIE 画像オブジェクトにコピーする"""
    with image_acquirer.fetch(timeout=TIMEOUT) as buffer:
        payload = buffer.payload
        component = payload.components[0]
        width = component.width
        height = component.height
        data_format = component.data_format
        assert data_format == DATA_FORMAT

        content = component.data.reshape(height, width)
        return pyfie.FHANDLE.clone_from_array(content)

# 画像1枚を取り込み
try:
    himg = capture_single_shot(ia)
except TimeoutException as e:
    print("画像取り込みがタイムアウトしました", file=sys.stderr)
    sys.exit(1)

# 取り込んだ画像を保存
pyfie.imwrite("captured.png", himg)

# 取り込んだ画像にフィルタを適用
hdst = himg.empty_like()
pyfie.medianMxN(himg, hdst, 11, 11, pyfie.F_BORDER_CONTINUOUS)

# フィルタを適用した画像を保存
pyfie.imwrite("filtered.png", hdst)

# 画像取り込みを停止し、カメラを解放
ia.stop()
ia.destroy()
h.reset()

処理結果例

取り込み画像

../../_images/captured.png

フィルタ処理後画像

../../_images/filtered.png

ダウンロード