IC Imaging Control (Python)

  • サンプルプログラムトップページ
  • はじめに
    • VS Codeを使ってサンプルプログラムを開発&デバッグする方法
  • デバイスのオープンとハンドリング
    • +デバイスを開く
    • +ダイアログボックスを使用してデバイスを開く
    • +デバイスプロパティ設定の保存と復元
    • +プロパティの設定方法
    • +接続しているカメラ一覧を表示
    • +ROIの設定方法
    • +オートフォーカスで焦点を調整する範囲を指定
    • +デバイスロストの検出と再接続方法
  • イメージの取得
    • +8bit静止画保存
    • +16bit静止画保存
    • +Enterキーを押下したときに画像保存
    • +メモリーレコーディング
    • +AVIファイル保存
  • 画像処理
    • +コールバック関数の設定方法(OpenCVで二値化)
    • +OpenCVで画像処理して表示する方法
    • +ソフトウェアトリガー・外部トリガーの使用方法
    • +ステレオカメラで表示
    • +2つのカメラで取得した画像の輝度値を平均してバーに表示する
  • IC Imaging Control3.5(pythonnet編)
    • +Qtを使ったデモアプリ(pythonnet編)
    • +カメラで取得した画像の輝度値を平均してバーに表示する
      (pythonnet編)
    • +動画保存(MediaStreamSink コーデック:H.264)
    • +露光時間・ゲインを設定し、静止画保存をする(pythonnet編)
  • リンク集

    ICImagingControl APIリファレンスマニュアル/サンプルプログラム

    :日本語対応済み :日本語化準備中
    開発言語 APIリファレンスマニュアル サンプルプログラム
    C 4.0
    ()
    - - 4.0
    ()
    - -
    C++ 4.0
    ()
    3.5
    ()
    3.4
    ()
    4.0
    ()
    3.5 3.4
    ()
    C#/VB.NET 4.0
    ()
    3.5
    ()
    3.4
    ()
    4.0
    ()
    3.5
    ()
    3.4
    ()
    Python 4.0
    ()
    3.5 3.4
    ()
    4.0
    ()
    3.5 3.4
    ()

VS Codeを使ってサンプルプログラムを開発&デバッグする方法

事前準備

  1. カメラドライバをインストール

    お持ちのUSBカメラ、GigEカメラにあったドライバをインストールしてください。
    https://www.argocorp.com/software/DL/tis/index.html#tab4

  2. SDKをインストール

    下記からIC Imaging Control4.0をインストールしてください。
    https://www.argocorp.com/software/DL/tis/index.html#tab4

  3. エディターのインストール

    メモ帳でもコーディングは可能ですが、シンタックスハイライト(色分け表示)、コード補完(予測変換)、デバッグ機能などで開発効率を高めるため、下記のVisual Studio Code(以下VS Code)をインストールしてください。
    https://code.visualstudio.com/

Visual Studio Codeの使い方

VS Codeを立ち上げてください。

「拡張機能」アイコンをクリックし、検索欄に“Python”と入力します。表示された一覧から「Python Extension Pack」または「Python」を選択してインストールしてください。あわせて日本語化が必要な場合は「Japanese Language Pack」をインストールし、完了後に VS Code を再起動してください。

Pythonのコーディングをするために[ファイル]→[新しいテキスト ファイル]を選択してください。

赤枠の入力欄に以下のサンプルプログラムを貼り付け、ファイル名を「test.py(拡張子 .py)」として保存してください。

# IC Imaging Control 4のライブラリを読み込む
import imagingcontrol4 as ic4

#プロパティセット+画像保存する関数
def set_property():
    # -----------------------------
    # 1) 使用できるカメラ一覧を取得
    # -----------------------------
    device_list = ic4.DeviceEnum.devices()

    # 取得したカメラの情報(モデル名・シリアル番号・接続バス)を表示
    for i, dev in enumerate(device_list):
        print(f"[{i}] {dev.model_name} ({dev.serial}) [{dev.interface.display_name}]")

    # ここでは 0 番目(最初)のカメラを選択
    dev_info = device_list[0]

    # -----------------------------
    # 2) 選択したカメラを Grabber に接続
    # -----------------------------
    grabber = ic4.Grabber(dev_info)

    # カメラの設定パラメータにアクセスするためのマップを取得
    prop_map = grabber.device_property_map

    # -----------------------------
    # 3) 主要パラメータを手動設定
    # -----------------------------
    # ■解像度 640x480    
    prop_map.set_value(ic4.PropId.WIDTH, 640)
    prop_map.set_value(ic4.PropId.HEIGHT, 480)

    # ■カラーフォーマット 例:Mono8,BayerRG8,BayerRG12p,BayerRG16,BGR8,YCbCr422_8,YCbCr411_8,YCbCr411_8_CbYYCrYY
    prop_map.set_value(ic4.PropId.PIXEL_FORMAT,"Mono8")

    # ■フレームレート 30fps
    prop_map.set_value(ic4.PropId.ACQUISITION_FRAME_RATE,30)

    # ■スキッピング 1x1
    #prop_map.set_value(ic4.PropId.DECIMATION_HORIZONTAL, 1)
    #prop_map.set_value(ic4.PropId.DECIMATION_VERTICAL, 1)

    # ■ビンング 1x1
    #prop_map.set_value(ic4.PropId.BINNING_HORIZONTAL, 1)
    #prop_map.set_value(ic4.PropId.BINNING_VERTICAL, 1)

    # ■トリガーモード:連続ストリームに設定
    prop_map.set_value(ic4.PropId.TRIGGER_MODE, "Off")

    # ■ゲイン
    prop_map.set_value(ic4.PropId.GAIN_AUTO, False)  # オートゲイン OFF
    prop_map.set_value(ic4.PropId.GAIN, 0)           # 手動で 0 dB に固定

    # ■露光時間
    prop_map.set_value(ic4.PropId.EXPOSURE_AUTO, False)   # オート露光 OFF
    prop_map.set_value(ic4.PropId.EXPOSURE_TIME, 20000)   # 20 000 µs(=20 ms)

    # ■ホワイトバランス(RGB 個別にゲインを設定)
    prop_map.set_value(ic4.PropId.BALANCE_WHITE_AUTO, False)  # オート WB OFF

    prop_map.set_value(ic4.PropId.BALANCE_RATIO_SELECTOR, "Red")
    prop_map.set_value(ic4.PropId.BALANCE_RATIO, 1.0)

    prop_map.set_value(ic4.PropId.BALANCE_RATIO_SELECTOR, "Blue")
    prop_map.set_value(ic4.PropId.BALANCE_RATIO, 1.3)

    prop_map.set_value(ic4.PropId.BALANCE_RATIO_SELECTOR, "Green")
    prop_map.set_value(ic4.PropId.BALANCE_RATIO, 1.2)

    # -----------------------------
    # 4) SnapSink を用意(静止画を手動取得)
    # -----------------------------
    sink = ic4.SnapSink()

    # カメラ → Grabber → SnapSink というデータ経路を確立
    grabber.stream_setup(sink)

    # -----------------------------
    # 5) ENTERキーを押すたびに撮影 → JPEG保存
    # -----------------------------
    for i in range(10):
        input("Press ENTER to snap and save a jpeg image")

        # snap_single(タイムアウト[ms]) で 1 枚キャプチャ
        buffer = sink.snap_single(1000)  # 1 000 ms 以内に来なければタイムアウト

        # バッファをJPEG形式で保存
        filename = f"image_{i}.jpeg"
        buffer.save_as_jpeg(filename, quality_pct=90)

        print(f"Saved image file {filename}\n")

    # -----------------------------
    # 6) 後始末(ストリーム停止 → デバイス切断)
    # -----------------------------
    # 関数終了時に grabber が破棄されるため必須ではないが、
    # 明示的に Stop/Close するとデバッグ時に分かりやすい。
    grabber.stream_stop()
    grabber.device_close()


# -----------------------------
# エントリポイント()
# -----------------------------
if __name__ == "__main__":
    # IC4 ライブラリの初期化。INFO レベルのログを STDERR へ出力
    with ic4.Library.init_context(api_log_level=ic4.LogLevel.INFO,
                                  log_targets=ic4.LogTarget.STDERR):
        # プロパティセット+画像保存する関数へ
        set_property()

ターミナルをVS Codeで開く

メニューから[表示]→[ターミナル]を選択すると、画面の下部分にターミナルが表示されます。

赤枠がターミナルと呼ばれる場所で、マウスを使わず「文字だけ」でPCに命令を送るための窓口です。

仮想環境を作成する

次に同じPCで複数プロジェクトを扱ってもライブラリのバージョン衝突を防ぐために仮想環境(プロジェクト専用の Python)を用意します。ターミナル画面で下記の通り入力します。

python -m venv .venv

上記を実行することで下記のようにフォルダ内にpython.exeが生成されます。

VS Codeで仮想環境を使う際は、実行に用いるPython本体として「.venv\Scripts\python.exe(Windowsの場合)」を明示的に選択します。これは仮想環境を作成したとき、その環境専用のPython実行ファイルとパッケージ管理コマンド(pip など)が「.venv」フォルダー内にコピーされる仕組みになっているためです。プロジェクトごとに別々のライブラリやバージョンを導入してもPC全体のPythonとは混ざらず、依存関係の衝突を防げるのが仮想環境の最大の利点です。

仮想環境の設定

VS Codeは選択されたインタープリターを基準に、ターミナルの自動有効化、デバッグ実行を行うため、誤ってシステム全体のpython.exeを選んでしまうと「モジュールが見つからない」「動作確認したはずのコードがエラーになる」といった食い違いが起こります。そのため、仮想環境を作成したら必ず 「.venv\Scripts\python.exe」を選択して「このプロジェクトでは仮想環境を使う」ということをVS Codeに認識させる必要があります。

VS Codeの右下に表示されているインタープリター名をクリックすると、画面上部に「インタープリターへのパスを入力」という欄が現れます。

そこで、先に作成した仮想環境フォルダ「.venv\Scripts\」内にあるpython.exeを選択してください。

パッケージのインストール

TISカメラを制御するためのパッケージをインストールするためにターミナル部分で下記のコマンドを入力します。

pip install imagingcontrol4

その他、OpenCVなどをインストールする際はここでさらに下記のコマンドを入力し、パッケージをインストールしておいてください。

pip install opencv-python

また、サンプルによっては下記のようにrequirements.txtに出くわすことがあります。
https://github.com/TheImagingSource/ic4-examples/blob/master/python/thirdparty-integration/imagebuffer-numpy-opencv-live/requirements.txt

requirements.txtには、Pythonプロジェクトで必要なパッケージとそのバージョンをリスト化したテキストファイルが記述されていますので、必要なパッケージを下記のコマンド一つでインストールできます。

pip install -r requirements.txt

Pythonの実行

VS Code上でF5キーを入力後、「Python Debugger」を選択し、

Pythonファイルを選択するとプログラムが実行されます。

IC4でデバイスプロパティ設定方法

カメラの動作を確認しながら、サンプルプログラム以外のパラメータを自由に変更したい場合は、IC Imaging Control 4 に付属する「DemoApp」を活用すると便利です。

ステップ1

エクスプローラーで「C:\Program Files\The Imaging Source Europe GmbH\ic4\demoapp」を開き、ic4-demoapp.exeを起動してください。カメラを選択しプロパティ画面を開くと Exposure、Trigger、Pixel Format などのプロパティが並んでおり、いずれかを選択すると ウィンドウ下部の空白エリアにパラメータの「型(整数は int、浮動小数点は float、文字列は string、真偽値は bool)」や「最小値/最大値/現在値」が表示されます。ここで「この項目は小数か?整数か?文字列か?」を把握しておくとPython側でget_value_○○をする際に型ミスを防げます。

ステップ2:

VS Code でサンプルスクリプトを開き、map.set_value() を入力すると 予測変換によってic4.PropId.から始まるプロパティ名一覧が表示されます(例:EXPOSURE_TIME、GAIN、TRIGGER_MODE など)。プロパティの正式名を迷わず選べるので活用してください。もし一覧で一括して型や上限値を確認したい場合は、コマンドプロンプトで

ic4-ctrl prop 0

と入力します(0 は 1 台目のカメラ番号)。全プロパティについて「型・最小値・最大値・現在設定値」などがテキストで出力されます。例としてフレームレートを52行目にフレームレートを追加してみます。

ステップ3:

各パラメータの型(整数はint、浮動小数点はfloat、文字列はstring、真偽値はbool)に対応したプロパティの設定・取得方法を示すサンプルコードを、以下に示します。

float(浮動小数点)型の場合は

map.set_value(ic4.PropId.ACQUISITION_FRAME_RATE, 30.0)
print(prop_map.get_value_float(ic4.PropId.ACQUISITION_FRAME_RATE))

なお、string(文字列)型の場合は

#文字列の場合はRedをダブルクォーテーションで囲ってください。
prop_map.set_value(ic4.PropId.BALANCE_RATIO_SELECTOR, "Red")
print(prop_map.get_value_str(ic4.PropId.BALANCE_RATIO_SELECTOR))

Bool(真偽)型の場合は

prop_map.set_value(ic4.PropId.EXPOSURE_AUTO, False) 
print(prop_map.get_value_bool(ic4.PropId.EXPOSURE_AUTO))

integer(整数)型の場合は

prop_map.set_value(ic4.PropId.EXPOSURE_AUTO_REFERENCE, 128)
print(prop_map.get_value_int(ic4.PropId.EXPOSURE_AUTO_REFERENCE))

他のプロパティも同じ手順で「demoapp で型を確認 → VS Codeの予測変換で正式名を選択 → get_value_○○で値を取得」という流れで順次追加してください。

▲ このページの先頭に戻る
株式会社アルゴ The Imaging Sourceカメラ製品一覧はこちら