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

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

Pythonでトリガー入力されたタイミングで画像を保存する

概要

このPythonサンプルは、ハードウェアトリガーのカメラをトリガーモードにし、トリガー入力されたタイミングで画像を受け取るための使用方法について示しています。
カメラが外部からトリガー入力された場合、プログラムでは画像がいつ到着するかわかりません。プログラム上でポーリング待ちすることでも可能ですが、ほかのプログラムも待ち状態になるため実装には不向きです。そのため、ここではフレームを受け取ったタイミングでコールバックが呼び出されるように作成されています。

開発環境

OS:Ubuntu 18.04.4 LTS
プログラミング言語:Python
デバイスドライバー:v4l2

サンプルプログラムダウンロード

サンプルコードファイルについて

TIS.py

GStreamerコードとプロパティ処理のラッパーとして、tiscameraリポジトリの GStreamerモジュールを使用しています。このプログラムファイルには、GStreamerコードのラッパーである「TIS」クラスが実装されていますので、TISクラスを使用することでGStreamerのパイプラインを記載することなく、コーディングすることが可能です。

ExternalTriggerProgram.py

メインファイル

事前準備

Tiscameraをインストール
インストール方法は下記のユーザーズガイドを参照してください。
https://www.argocorp.com/software/DL/tis/Linux/index.html#usersguide

カメラを開く方法

TISクラスをインスタンス化する
Tis = TIS.TIS()

シリアル番号:16710581 のカメラを下記のフォーマットで開く。
# 幅=640、高さ=480 フレームレート=30
# カラーフォーマット GRAY8 、カラーの場合はRGBx (RGB32と同じ)
Tis.openDevice("16710581", 640, 480, "1/1", TIS.SinkFormats.GRAY8,True) 

ダイアログウィンドウでデバイス、フォーマット、フレームレートを指定する方法は下記の通りです。
Tis.selectDevice()

上記でデバイスを開いた後、ライブビデオを開始します。
TIS.Start_pipeline()

ライブビデオを停止します。
TIS.Stop_pipeline()

コールバック関数

CustomData で呼び出されたタイミングでカウンタ変数imagecounterとbusyを定義します。
class CustomData:
def __init__(self, ):
self.imagecounter = 0;
self.busy = False;

コールバック関数は下記の通りです。
def on_new_image(tis, userdata):
 # ビジー状態のときは回避
 if userdata.busy is True:
  return

 userdata.busy = True
 image = tis.Get_image()

 # 画像処理を記載
 # 例:収縮処理
 kernel = np.ones((5, 5), np.uint8)
 image = cv2.erode(image, kernel, iterations=5) 

 # 保存するJpegファイル名称を編集
 userdata.imagecounter += 1;
 filename = "./image{:04}.jpg".format(userdata.imagecounter)

 # jpegで保存
 cv2.imwrite(filename, image)
 userdata.busy = False
コールバック関数の呼び出し法はまずCustomDataをインスタンス化し、
Set_Image_Callbackのメソッドでコールバック関数を呼び出します。
# CustomData classをインスタンス化
CD = CustomData()

#Gstreamerのパイプラインを実行している間は画像処理を避けるためにビジーをTrueにする
CD.busy = True
下記の通り、ライブビデオを開始する前に、コールバックがTISクラスにセットされます。
# コールバック関数を呼び出す
Tis.Set_Image_Callback(on_new_image, CD)

トリガーモード

Gstreamerのパイプラインを実行している間は画像処理を避けるためにビジーをTrueにし、トリガーモードをオフにした状態でパイプラインを開始します。
なお、トリガーモードにするメソッドはUSBカメラとGigEカメラでは引数が異なります。

GigEカメラの場合

CD.busy = True 
Tis.Set_Image_Callback(on_new_image, CD)
Tis.Set_Property("Trigger Mode", “Off”)
Tis.Start_pipeline()
Tis.Set_Property("Trigger Mode", “On”)
CD.busy = False

USBカメラの場合

CD.busy = True 
Tis.Set_Image_Callback(on_new_image, CD)
Tis.Set_Property("Trigger Mode", False)
Tis.Start_pipeline()
Tis.Set_Property("Trigger Mode", True)
CD.busy = False

ソフトウェアトリガー

下記のコマンドのプロパティ値を設定することで1フレームを送信することができます。
Tis.Set_Property("Software Trigger",1) 

python scriptを実行

任意の場所に下記のサンプルコードを配置しコマンドを実行
$python3 ExternalTriggerProgram.py

実行結果



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