産業用UVCカメラのすすめ 産業用UVCカメラのすすめ

※画面を横にするとパソコン版のレイアウトでご覧いただけます。正しく表示されていない場合は横向きでご覧ください。

TheImagingSource社のカメラでPython+OpenCVで動作させる方法(解説)

TheImagingSource社が提供しているAPI(ICImagingControl3.4)を使用して、Pythonでカメラを開く方法、画像データを取得する方法、OpenCVで画像処理する方法について示しています。
ここではGithub上にサンプルプログラムとしてアップロードされているメインプログラム「tis-OpenCV.py」を例にして、TheImagingSource社のカメラを使って取得した画像の収縮処理を実装方法について解説します。

実行結果

画像処理前画像(上下反転、収縮画像処理なし)



OpenCV処理あり(上下反転、収縮画像処理あり)
tis-OpenCV.py
# OpenCVライブラリを使って上下反転
image = cv2.flip(image,0)
# OpenCVライブラリを使って収縮処理
image = cv2.erode(image,np.ones((50, 50)))


サンプルコードの入手方法、導入手順については下記を参考にしてください。
https://www.argocorp.com/UVC_camera/Windows_Python_operating.html
https://www.argocorp.com/UVC_camera/Windows_Python_Anaconda_operating.html

使用するファイルについて

tisgrabber.py

TheImagingSource社が提供するAPIであるIC Imaging Controlをカプセル化するtisgrabber.dllのラッパープログラム(IC Imaging Controlを使いやすくするためのもの)となっています。IC Imaging Control DLLの32ビットバージョン(tisgrabber.dll、TIS_UDSHL11.dll)と64ビットバージョン(tisgrabber_x64.dll、TIS_UDSHL11_64.dll)のどちらを使用するかが自動的にチェックしたり、IC Imaging Controlで使用されているメソッドを呼び出すために使われています。

tisgrabber.dll

IC Imaging ControlをPythonで呼び出すための32 bitバージョンのDLL

TIS_UDSHL11.dll

IC Imaging Controlの32 bitバージョンのDLL

tisgrabber_x64.dll

IC Imaging ControlをPythonで呼び出すための64 bitバージョンのDLL

TIS_UDSHL11_64.dll

IC Imaging Controlの64 bitバージョンのDLL

tis-OpenCV.py

実行されるメインプログラム。

手順1:importで宣言する

Pythonで下記のライブラリやモジュールを使用するためにimportを使います。

  • ctype・・・・・このライブラリは C と互換性のあるデータ型を提供し、共有ライブラリ(Windowsでは*.dll)の関数を呼び出すことができます。また、DLL(Dynamic Link Library、ダイナミックリンクライブラリ)とは、Windowsにおける共有ライブラリの仕組みのことで、dllを読み込むことでTheImagingSource社のカメラにアクセスするための特別なコーディングをすることなく簡単にPythonでコーディングすることができます。
  • tisgrabber ・・IC Imaging Controlを制御するラッパーファイルを読み込むために使用します。
  • cv2・・・・・・OpenCVで画像処理を行うために使用します。
  • numpy ・・・・Pythonでの機械学習の計算をより速く、効率的に行えるようにするために拡張モジュールを使用します。
import ctypes as C
import tisgrabber as IC
import cv2
import numpy as np

手順2:カメラデバイスの選択する

カメラを開く方法は下記の2種類があります。
1)ダイアログウィンドウを開いてコンボボックスから選択する場合
#カメラオブジェクトを生成
Camera = IC.TIS_CAM()
#カメラ名とシリアル番号の一覧を取得し表示
Devices = Camera.GetDevices()
for i in range(len( Devices )):
    print( str(i) + " : " + str(Devices[i]))

# IC Imaging Control deviceの子画面を表示しデバイスダイアログのコンボボックスからカメラを選択する
Camera.ShowDeviceSelectionDialog()

#デバイスが存在しているかどうかをチェック
if Camera.IsDevValid() == 1:
    # ライブスタート開始
    #画像の取り込み開始前にコールされている必要があります。
    #引数を0にすることでライブ表示をオフにすることができます。
    Camera.StartLive(1)

Camera.ShowDeviceSelectionDialog()メソッドを呼び出すことで下記のDevice Settingsのダイアログ画面を表示することができます。

ダイアログ画面にて「デバイス」「カラーフォーマット」「フレームレート」を指定することができます。 そのため、Camera.open や.SetVideoFormatや.SetFrameRateのメソッドを呼び出す必要がありません。

なお、下記の「Properties...」ボタン(赤枠部分)から呼び出される「Device Properties」画面は一部機能しませんので、別途「手順3:カメラプロパティ設定する」にて操作する必要があります。

また、下記の「Customize...」ボタン(青枠部分)から呼び出される「select Custom Format」によってVideo Formatの一覧にはない解像度やビニング機能の指定をすることができます。

2)カメラの型番とシリアル番号を直接指定する場合
#カメラオブジェクトを生成
Camera = IC.TIS_CAM()
#カメラ名とシリアル番号の一覧を取得し表示
Devices = Camera.GetDevices()
for i in range(len( Devices )):
    print( str(i) + " : " + str(Devices[i]))

# カメラの型番とシリアル番号でカメラの指定する
#同じ型番のカメラを複数接続していても一意に開くことが可能
Camera.open("DFK 33UX290 18810256")

#デバイスが存在しているかどうかをチェック
if Camera.IsDevValid() == 1:
    # カラーフォーマットを指定
    #IC Captureなどに記載がないようなサイズ(例:528x298)でも解像度の指定は可能
    #ただし、設定できる範囲は解像度のステップ数がカメラによって異なるので500x500などの解像度の指定はできないこともあります
    #設定できる範囲は事前に「select Custom Format」で設定範囲を確認の上指定を行ってください
    Camera.SetVideoFormat("RGB32 (528x294)")
    #カメラスキッピング・ビニングの指定も可能(機種によって使用できません)
    Camera.SetVideoFormat("RGB32 (1216x960)[Skipping 2x]")
    # フレームレートを30fpsに指定
    Camera.SetFrameRate( 30.0 )
    # ライブスタート開始
    #画像の取り込み開始前にコールされている必要があります。
    #引数を0にすることで画面表示をオフにすることができます。
    Camera.StartLive(1)

手順3:カメラプロパティ設定する

カメラにはゲインや露光時間、ホワイトバランスなど様々なプロパティ値があります。
そのプロパティ値を設定するために下記のようなメソッドを使うことで簡単にプロパティ値の設定を行うことができます。
設定できるプロパティ値に関してはIC Imaging Control VCD Property Inspectorにて 確認することができます。詳細は下記参照してください。
https://www.argocorp.com/software/sdk/ICImagingControl/users_guide/technic/vcdPropety/tech_VCDProperties.htm
なお、ゲイン・露光時間・ホワイトバランスを固定化するには必ずそれぞれの自動設定をOFFにする必要があります。
下記ではゲイン・露光時間・ホワイトバランスの自動調整をOFFにして任意のパラメータに設定をしています。
# カメラのプロパティを設定
# 露光時間を設定

ExposureAuto=[1]

#####露光時間の設定#####
# 自動露光時間をオフにする(露光時間を固定化するのに必須)
Camera.GetPropertySwitch("Exposure","Auto",ExposureAuto)
#コンソールに表示
print("Exposure auto : ", ExposureAuto[0])


# IC Imaging Control VCD Property Inspectorでセットするプロパティの要素、
# インターフェースを確認し下記のようにセットする。

# Switchの場合 
# "0" の場合off, "1" の場合 on. 
# 露光時間を固定化するために自動露光時間の設定をOFFにする
Camera.SetPropertySwitch("Exposure","Auto",0)


ExposureTime=[0]
Camera.GetPropertyAbsoluteValue("Exposure","Value",ExposureTime)
print("Exposure time abs: ", ExposureTime[0])

# AbsoluteValueの場合
# ここでは設定できる最長の露光時間に1/30fps(=0.0303)に設定する
Camera.SetPropertyAbsoluteValue("Exposure","Value",0.0303)

#####ゲインの設定#####
# 自動ゲインをオフにする(ゲインを固定化するのに必須)
Gainauto=[0]
Camera.GetPropertySwitch("Gain","Auto",Gainauto)
print("Gain auto : ", Gainauto[0])
# 自動ゲインの設定。自動ゲインがあるため、まず無効にします。
Camera.SetPropertySwitch("Gain","Auto",0)
# ゲインの設定
Camera.SetPropertyValue("Gain","Value",10)

#####ホワイトバランスの設定#####
WhiteBalanceAuto=[0]

# 自動ホワイトバランスの設定ONにするときには下記の設定
#Camera.SetPropertySwitch("WhiteBalance","Auto",1)
#Camera.GetPropertySwitch("WhiteBalance","Auto",WhiteBalanceAuto)
#print("WB auto : ", WhiteBalanceAuto[0])


# 自動ホワイトバランスの設定をOFFにする(ホワイトバランスを固定化するのに必須)
Camera.SetPropertySwitch("WhiteBalance","Auto",0)
Camera.GetPropertySwitch("WhiteBalance","Auto",WhiteBalanceAuto)
print("WB auto : ", WhiteBalanceAuto[0])
# ホワイトバランスの値を固定にする
Camera.SetPropertyAbsoluteValue("WhiteBalance","White Balance Red",2)
Camera.SetPropertyAbsoluteValue("WhiteBalance","White Balance Green",1)
Camera.SetPropertyAbsoluteValue("WhiteBalance","White Balance Blue",0.1)

# ホワイトバランスの値を確認する
WhiteBalance = [0]
Camera.GetPropertyAbsoluteValue("WhiteBalance","White Balance Red",WhiteBalance)
print("WB Red : ", WhiteBalance[0])
Camera.GetPropertyAbsoluteValue("WhiteBalance","White Balance Green",WhiteBalance)
print("WB Green : ", WhiteBalance[0])
Camera.GetPropertyAbsoluteValue("WhiteBalance","White Balance Blue",WhiteBalance)
print("WB Blue : ", WhiteBalance[0])


# ソフトウェアトリガー
Camera.PropertyOnePush("Trigger", "Software Trigger")

# ワンプッシュでフォーカスをあわせる(オートフォーカスカメラのみ)
Camera.PropertyOnePush("Focus","One Push")
設定範囲は下記のIC Imaging Control VCD Property Inspectorにて確認することができます。
IC Imaging Control VCD Property InspectorはIC Imaging Controlをインストールしたときに一緒にインストールされております。

例:White Balance Greenの設定範囲

手順4:カメラからイメージ取得し画像処理をする

SnapImageメソッドによって、ライブ画像ストリームより静止画をキャプチャしリングバッファに保存します。リングバッファに保存した画像を引数としてOpenCVに引き渡すだけで画像処理を簡単に行えます。
try:
# ループ
    while ( True ):
        # カメラからイメージを取得
        Camera.SnapImage()
        # imageにカメラから取得したイメージを格納
        image = Camera.GetImage()
        # OpenCVライブラリを使って上下反転
        image = cv2.flip(image,0)
        # OpenCVライブラリを使って収縮処理
        image = cv2.erode(image,np.ones((11, 11)))
        # 画像をウィンドウに表示する
        cv2.imshow('Window', image)
        cv2.waitKey(10)

# ctrl-cで停止したとき
except KeyboardInterrupt:
    #ライブストリームを止める
 Camera.StopLive()    
    cv2.destroyWindow('Window')
TheImagingSource社の製品のお持ちの方はPython用ライブラリで上記のように簡単にコーディングを行えます。また、TheImagingSource社のカメラではPythonだけでなくC++、C#、VB.Netのサンプルなども取り扱っておりますので、どの言語でも手軽に開発することができます。

産業用UVCカメラ
産業用カメラの基礎
産業用カメラのスペックの見方
Windows
Linux
Jetson Nano