VS Codeを使ってサンプルプログラムを開発&デバッグする方法
事前準備
- カメラドライバをインストール
お持ちのUSBカメラ、GigEカメラにあったドライバをインストールしてください。
https://www.argocorp.com/software/DL/tis/index.html#tab4 - SDKをインストール
下記からIC Imaging Control4.0をインストールしてください。
https://www.argocorp.com/software/DL/tis/index.html#tab4 - エディターのインストール
メモ帳でもコーディングは可能ですが、シンタックスハイライト(色分け表示)、コード補完(予測変換)、デバッグ機能などで開発効率を高めるため、下記の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
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_○○で値を取得」という流れで順次追加してください。