オートフォーカスで焦点を調整する範囲を指定
概要
オートフォーカスのワンプッシュ機能の実装方法について説明します。
サンプルプログラム
サンプル(Python) | autofocus_onepush_region_python.zip |
---|
ご利用いただけるカメラは下記の機種のみです。
DFK(DMK)22/72-F、DFK(DMK)AFUxxx-M12
DFK(DMK)39GX265-Z20、DFKZ30GP031、DFKZ12GP031
サンプルツールの出力
コード全体
import ctypes
import tisgrabber as tis
import time
#tisgrabber_x64.dllをインポートする
ic = ctypes.cdll.LoadLibrary("./tisgrabber_x64.dll")
tis.declareFunctions(ic)
#ICImagingControlクラスライブラリを初期化します。
#この関数は、このライブラリの他の関数が呼び出される前に1回だけ呼び出す必要があります。
ic.IC_InitLibrary(0)
#ダイアログ画面を表示
hGrabber = tis.openDevice(ic)
if ic.IC_IsDevValid(hGrabber):
# 1920x1080の解像度で表示
# 1920x1080以下の解像度にする場合は変更してください。
if ic.IC_SetVideoFormat(hGrabber, tis.T("RGB32 (1920x1080)")) == tis.IC_ERROR:
print("1920x1080の解像度でカラーで表示できません。")
ic.IC_ReleaseGrabber(hGrabber)
quit()
#解像度を指定
ic.IC_SetFrameRate(hGrabber, ctypes.c_float(30.0))
#ライブスタート開始 引数:0の時非表示、引数:1の時表示
ic.IC_StartLive(hGrabber, 1)
# オートフォーカスの有効化
if ic.IC_SetPropertySwitch(hGrabber, tis.T("Focus"), tis.T("Enable Region of Interest"), 1) == tis.IC_SUCCESS:
#フォーカス調整する関心領域
ic.IC_SetPropertyValue(hGrabber, tis.T("Focus"), tis.T("Left"), 100)
ic.IC_SetPropertyValue(hGrabber, tis.T("Focus"), tis.T("Top"), 100)
ic.IC_SetPropertyValue(hGrabber, tis.T("Focus"), tis.T("Right"), 400)
ic.IC_SetPropertyValue(hGrabber, tis.T("Focus"), tis.T("Bottom"), 400)
else:
print("フォーカス制御をサポートしていない機種です。")
# オートフォーカスのワンプッシュ
if ic.IC_PropertyOnePush(hGrabber, tis.T("Focus"), tis.T("One Push")) == tis.IC_SUCCESS:
print("自動フォーカス、スタート")
onepushrunning = ctypes.c_long()
# オートフォーカスが終わるまで待つ
if ic.IC_GetPropertySwitch(hGrabber, tis.T("Focus"), tis.T("One Push Running"), onepushrunning) == tis.IC_SUCCESS:
while onepushrunning.value == 1:
time.sleep(1)
ic.IC_GetPropertySwitch(hGrabber, tis.T("Focus"), tis.T("One Push Running"), onepushrunning)
else:
print("このカメラではワンプッシュの機能はサポートしていません。")
print("自動フォーカス、終了")
else:
print("このカメラではオートフォーカスのワンプッシュをサポートしていません。")
ic.IC_MsgBox(tis.T("OKボタンで終了します。"), tis.T("Simple Live Video"))
ic.IC_StopLive(hGrabber)
else:
ic.IC_MsgBox(tis.T("No device opened"), tis.T("Simple Live Video"))
ic.IC_ReleaseGrabber(hGrabber)
解説
そもそもフォーカス値の算出は、ユーザが指定した所定の映像領域の輝度値に対して微分処理を行い、微分処理した値の総和を使用し、最も総和が高いものをフォーカスがあっているものとしてロジックを組む必要がありますが、TheImagingSource社ではそのロジックをAPIで用意しています。オートフォーカスにするには下記のロジックをしてください。
オートフォーカスをする領域を選択する
# オートフォーカス関心領域の有効化
if ic.IC_SetPropertySwitch(hGrabber, tis.T("Focus"), tis.T("Enable Region of Interest"), 1) == tis.IC_SUCCESS:
#フォーカス調整する関心領域
ic.IC_SetPropertyValue(hGrabber, tis.T("Focus"), tis.T("Left"), 100)
ic.IC_SetPropertyValue(hGrabber, tis.T("Focus"), tis.T("Top"), 100)
ic.IC_SetPropertyValue(hGrabber, tis.T("Focus"), tis.T("Right"), 400)
ic.IC_SetPropertyValue(hGrabber, tis.T("Focus"), tis.T("Bottom"), 400)
上記ではオートフォーカスの関心領域をxy座標(100,100)を起点として縦横300pixel分を切り出しています。
上記のオートフォーカス関心領域の有効化を指定しなくてもオートフォーカスを調整することが可能です。
この切り出した範囲内の輝度値に対して微分処理を行います。
ワンプッシュ処理
if ic.IC_PropertyOnePush(hGrabber, tis.T("Focus"), tis.T("One Push")) == tis.IC_SUCCESS:
print("自動フォーカス、スタート")
onepushrunning = ctypes.c_long()
# オートフォーカスが終わるまで待つ
if ic.IC_GetPropertySwitch(hGrabber, tis.T("Focus"), tis.T("One Push Running"), onepushrunning) == tis.IC_SUCCESS:
while onepushrunning.value == 1:
time.sleep(1)
ic.IC_GetPropertySwitch(hGrabber, tis.T("Focus"), tis.T("One Push Running"), onepushrunning)
ワンプッシュのメソッドをコールすることで、先に切出した範囲で輝度値に対して微分処理を行い、微分処理した値の総和が高いものがでるまで、動作し続けます。