IC Imaging Control (Python)

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

    ICImagingControl WEB 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
    ()

デバイスロストの検出と再接続方法

概要

このサンプルは、デバイスロストしたときのイベントハンドラーの使用方法を説明しています。

サンプルプログラム

サンプル(Python) device_lost_event_python.zip

サンプルの出力

コード全体

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)


class CallbackUserdata(ctypes.Structure):
    """  コールバック関数に渡されるユーザーデータの例 """
    def __init__(self, ):
        self.unsused = ""
        self.devicename = ""
        self.connected = False


def frameReadyCallback(hGrabber, pBuffer, framenumber, pData):
    # コールバック関数処理
    # 省略
    return


def deviceLostCallback(hGrabber, userdata):
    """ このデバイスはコールバック関数を失いました。 カメラが切断された場合に呼び出されます。
     この関数は、メインスレッドではなく、別スレッドで実行されます。
     :param:hGrabber:これはグラバーオブジェクトへの実際のポインターです。(使用禁止)
     :param:userdata:ユーザーデータ構造へのポインター
    """
    userdata.connected = False
    print("Device {} lost".format(userdata.devicename))


# コールバック関数を定義
# 関数ポインタを作成
frameReadyCallbackfunc = ic.FRAMEREADYCALLBACK(frameReadyCallback)
userdata = CallbackUserdata()
devicelostcallbackfunc = ic.DEVICELOSTCALLBACK(deviceLostCallback)

#ダイアログ画面を表示
hGrabber = tis.openDevice(ic)

if ic.IC_IsDevValid(hGrabber):
    userdata.devicename = ic.IC_GetDeviceName(hGrabber).decode('utf-8', 'ignore')
    userdata.connected = True

    ic.IC_SetCallbacks(hGrabber,
                       frameReadyCallbackfunc, None,
                       devicelostcallbackfunc, userdata)
    #連続モードでは、フレームごとにコールバックが呼び出されます。
    ic.IC_SetContinuousMode(hGrabber, 0) #コールバック関数を使用するときには必ず定義
    #Windowサイズを640x480にする
    ic.IC_SetDefaultWindowPosition(hGrabber, 0)
    ic.IC_SetWindowPosition(hGrabber, 0,0, 640, 480)
    ic.IC_StartLive(hGrabber, 1)
    print("接続しているデバイスをPCから切断してください。")

    # デバイスロストを検出
    while(userdata.connected):
        time.sleep(0.5)
    ic.IC_StopLive(hGrabber)
    ic.IC_ReleaseGrabber(hGrabber)

    #デバイス再認識しライブストリーミング開始
    while(not userdata.connected):
        hGrabber = ic.IC_LoadDeviceStateFromFile(None, tis.T("device.xml"))
        if(ic.IC_IsDevValid(hGrabber)):
            ic.IC_SetDefaultWindowPosition(hGrabber, 0)
            ic.IC_SetWindowPosition(hGrabber, 0,0, 640, 480)
            ic.IC_StartLive(hGrabber, 1)
            userdata.connected = True

    key = ""
    while key != "q":
        print("qキー: プログラムを終了")
        key = input('qキーを押下してください。:')

    ic.IC_StopLive(hGrabber)

else:
    ic.IC_MsgBox(tis.T("No device opened"), tis.T("Device Lost Example"))

ic.IC_ReleaseGrabber(hGrabber)

解説

userdata = CallbackUserdata() #ユーザーデータ構造
devicelostcallbackfunc = ic.DEVICELOSTCALLBACK(deviceLostCallback)

デバイスロストのイベントハンドラーを発火させるために上記の関数ポインタを作成します。

userdata.devicename = ic.IC_GetDeviceName(hGrabber).decode('utf-8', 'ignore')
userdata.connected = True

ic.IC_SetCallbacks(hGrabber,
                   frameReadyCallbackfunc, None,
                   devicelostcallbackfunc, userdata)

IC_SetCallbacksにdevicelostcallbackfuncをセットすればイベントハンドラーの設定が完了します。

def deviceLostCallback(hGrabber, userdata):
    userdata.connected = False
    print("Device {} lost".format(userdata.devicename))

USBケーブルやLanケーブルなどをカメラやデバイスから外すと上記のイベントが発火します。

# デバイスロストを検出
while(userdata.connected):
    time.sleep(0.5)
ic.IC_StopLive(hGrabber)
ic.IC_ReleaseGrabber(hGrabber)

PCがカメラを認識できなくなった段階でuserdata.connectedの値がfalseになりますので、上記のようにデバイスロストを検出してグラバーオブジェクトを破棄することができます。

#デバイス再認識しライブストリーミング開始
while(not userdata.connected):
    hGrabber = ic.IC_LoadDeviceStateFromFile(None, tis.T("device.xml"))
    #デバイスが有効か
    if(ic.IC_IsDevValid(hGrabber)):
        ic.IC_SetDefaultWindowPosition(hGrabber, 0)
        ic.IC_SetWindowPosition(hGrabber, 0,0, 640, 480)
        ic.IC_StartLive(hGrabber, 1)
        userdata.connected = True

key = ""
while key != "q":
    print("qキー: プログラムを終了")
    key = input('qキーを押下してください。:')

また、接続していたカメラを再認識するようにするには上記の通り記載します。
openDeviceメソッドによってカメラを開くと自動的にxmlファイルが生成されるようになっていますので、while文のループ内でxmlファイルを読み込みデバイスが有効な状態であるのか確認し、デバイスが有効になったらライブスタートすることができます。

▲ このページの先頭に戻る

Copyright © ARGO Corporation. All Rights Reserved.