露光時間・ゲインを設定し、静止画保存をする(pythonnet編)
概要
IC Imaging Control 3.5のWindows専用APIを使用したPythonのプログラムで、ここでは露光時間・ゲインを設定し静止画として保存しています。
サンプルプログラム
サンプル(Python) | pythonnet_snap_save_image_python.zip |
---|
サンプルの出力
なし(実行プログラム内にimage.jpgが保存されます)
コード全体
import ctypes as C
import numpy as np
# PyhtonNetをインポートする
import clr
# 同じフォルダ内にあるIC Imaging Control3.5のDllを参照する
clr.AddReference('TIS.Imaging.ICImagingControl35')
clr.AddReference('System')
# IC Imaging Control namespaceを宣言
import TIS.Imaging
from System import TimeSpan
#IC Imaging Controlのオブジェクトを作成
ic = TIS.Imaging.ICImagingControl()
# snap sinkを宣言(静止画を保存するための画像バッファ)
snapsink = TIS.Imaging.FrameSnapSink(TIS.Imaging.MediaSubtypes.RGB32)
ic.Sink = snapsink
ic.LiveDisplay = False
# 最後に使用したビデオキャプチャデバイスを開く
try:
ic.LoadDeviceStateFromFile("device.xml",True)
if ic.DeviceValid is True:
ic.LiveStart()
except Exception as ex:
ic.ShowDeviceSettingsDialog()
if ic.DeviceValid is True:
ic.SaveDeviceStateToFile("device.xml")
ic.LiveStart()
pass
# 各プロパティ値を取得
ExposureAuto = ic.VCDPropertyItems.FindInterface(TIS.Imaging.VCDIDs.VCDID_Exposure,
TIS.Imaging.VCDIDs.VCDElement_Auto,TIS.Imaging.VCDIDs.VCDInterface_Switch)
#露出用の絶対値インターフェース。露出時間を秒単位で設定できます。
ExposureValue = ic.VCDPropertyItems.FindInterface(TIS.Imaging.VCDIDs.VCDID_Exposure,
TIS.Imaging.VCDIDs.VCDElement_Value,TIS.Imaging.VCDIDs.VCDInterface_AbsoluteValue)
#自動ゲインプロパティを取得する
GainAuto = ic.VCDPropertyItems.FindInterface(TIS.Imaging.VCDIDs.VCDID_Gain,
TIS.Imaging.VCDIDs.VCDElement_Auto,TIS.Imaging.VCDIDs.VCDInterface_Switch)
#ゲイン値を取得
GainValue = ic.VCDPropertyItems.FindInterface(TIS.Imaging.VCDIDs.VCDID_Gain,
TIS.Imaging.VCDIDs.VCDElement_Value,TIS.Imaging.VCDIDs.VCDInterface_Range)
#自動ゲインをOFFにする
if GainAuto is not None:
GainAuto.Switch = False
# ゲインの値をセットする
if GainValue is not None:
GainValue.Value = GainValue.RangeMin
# 露出自動を無効にする
if ExposureAuto is not None:
ExposureAuto.Switch = False
# 1/30秒の露出時間を設定します
if ExposureValue is not None:
ExposureValue.Value = 0.0333
#1回目の撮影で上記で設定したプロパティを有効化
snapsink.SnapSingle(TimeSpan.FromSeconds(5))
#2回目の撮影で上記で設定したプロパティを有効化
frame = snapsink.SnapSingle(TimeSpan.FromSeconds(5))
# 75%の品質で画像を保存する
TIS.Imaging.FrameExtensions.SaveAsJpeg( frame,"image.jpg", 75)
print("Image saved.")
#ライブストリーミングを停止する
ic.LiveStop()
ic.Dispose()
解説
pythonnetでのVCDプロパティの設定方法
IC Imaging Contorol 3.4をインストールした時にVCD Property Inspectorがインストールされていますので、そのアプリを立ち上げてカメラを選択すると設定できるプロパティ値が出てきます。
下記の通り、VCD Property Inspectorが起動します。 VCD プロパティはツリー構造で構成されており、名前と要素(値やスイッチなど)をセットで持ったオブジェクト(VCDPropertyItem)です。そのオブジェクトの要素(VCDPropertyElement)には 、要素を調整する為のインターフェースのセットを持っており、簡単にプロパティ値にアクセスできるようになっています。
プロパティを操作する為には適切な項目、要素、インターフェースを呼び出す必要があります。そのためにItem ID、Element ID、Interface ID確認します。
例:Gain VCDElement_Value AbsoluteValueの場合(上図の赤枠を参照)
Item ID | VCDID_Gain |
---|---|
Element ID | VCDElement_Value |
Interface ID | VCDInterface_AbsoluteValue |
VCDPropertyItems.FindItem メソッドを使って適切なプロパティに割り当てます。呼び出されるプロパティ項目はIDで指定する必要があります。今回の場合は"Gain"のVCDID_Gain等になります。さらに、プロパティは複数のエレメントから構成されています。エレメントには値や自動設定、ワンプッシュ動作などのパラメータがあります。プロパティの調整をするのにはインターフェースが使われ、プロパティ項目のエレメントより取得することが可能です。
取得したインターフェースを用いてカメラのプロパティ値を制御することができます。
# 各プロパティ値を取得
ExposureAuto = ic.VCDPropertyItems.FindInterface(TIS.Imaging.VCDIDs.VCDID_Exposure,
TIS.Imaging.VCDIDs.VCDElement_Auto,TIS.Imaging.VCDIDs.VCDInterface_Switch)
#露出用の絶対値インターフェース。露出時間を秒単位で設定できます。
ExposureValue = ic.VCDPropertyItems.FindInterface(TIS.Imaging.VCDIDs.VCDID_Exposure,
TIS.Imaging.VCDIDs.VCDElement_Value,TIS.Imaging.VCDIDs.VCDInterface_AbsoluteValue)
#自動ゲインプロパティを取得する
GainAuto = ic.VCDPropertyItems.FindInterface(TIS.Imaging.VCDIDs.VCDID_Gain,
TIS.Imaging.VCDIDs.VCDElement_Auto,TIS.Imaging.VCDIDs.VCDInterface_Switch)
#ゲイン値を取得
GainValue = ic.VCDPropertyItems.FindInterface(TIS.Imaging.VCDIDs.VCDID_Gain,
TIS.Imaging.VCDIDs.VCDElement_Value,TIS.Imaging.VCDIDs.VCDInterface_Range)
#自動ゲインをOFFにする
if GainAuto is not None:
GainAuto.Switch = False
# ゲインの値をセットする
if GainValue is not None:
GainValue.Value = GainValue.RangeMin
# 露出自動を無効にする
if ExposureAuto is not None:
ExposureAuto.Switch = False
# 1/30秒の露出時間を設定します
if ExposureValue is not None:
ExposureValue.Value = 0.0333
下記のリファレンスマニュアルにてVCDプロパティの基本機能について記載しております。
VCDプロパティの基本機能
IC Imaging Control_Ver3.5(C#/VB.NET) APIリファレンスマニュアル
画像を取得
# snap sinkを宣言(静止画を保存するための画像バッファ)
snapsink = TIS.Imaging.FrameSnapSink(TIS.Imaging.MediaSubtypes.RGB32)
ic.Sink = snapsink
# 省略
#1回目の撮影で上記で設定したプロパティを有効化
snapsink.SnapSingle(TimeSpan.FromSeconds(5))
#2回目の撮影で上記で設定したプロパティを有効化
frame = snapsink.SnapSingle(TimeSpan.FromSeconds(5))
# 75%の品質で画像を保存する
TIS.Imaging.FrameExtensions.SaveAsJpeg( frame,"image.jpg", 75)
FrameSnapSinkの場合、上記の通りsnapsinkのメソッドを呼び出すだけで画像を保存することができます。