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

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

Linux環境(Jetson Nanoあるいはラズベリーパイ)にて
TISカメラをPythonで動作させる方法[初心者向け]

目的、概要

Linux環境(Jetson Nanoあるいはラズベリーパイ)にてPythonとOpenCVでTISカメラを動作させる方法について説明します。

開発環境

Jetson Nano の場合

動作環境:JetsonNano(JetPack4.4.0)
対象OS:Jetson Nano Developer Kit SD Card Image Version: JP 4.2.3
開発言語:Python3.6.9
必要なパッケージ:python-opencv,python-gst-1.0,tiscamera

Raspberry Pi の場合

動作環境:Raspbery Pi 4 Model B (memory 4GB)
対象OS:Raspbian Buster(Version:September 2019、Release date:2019-09-26)
開発言語:Python3.6.9
必要なパッケージ:python-opencv,python-gst-1.0,tiscamera

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

実行結果

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

TIS.py

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

OpenCVsample.py

メインファイル(詳細は下記を参照)

実行手順

LinuxでTISカメラを使用するためにはtiscameraモジュールのインストールを実施してください。
インストール方法等は下記に記載がございます。

Jetson nano:https://www.argocorp.com/software/DL/tis/Linux/Jetson-nano_USB.html
Raspbery Pi:https://www.argocorp.com/software/DL/tis/Linux/RaspberryPI_USB.html

接続確認

インストール実施後、下記のコマンドで接続したカメラが認識していることを確認します。 接続されたカメラの型番、接続タイプ、接続したカメラのシリアル番号の3つが表示されます。 下記のようにデバイスが認識されていれば準備完了です。

tcam-ctrl -l

上記の情報をもとにPythonでコーディングをしていきます。

サンプルプログラム解説

モジュールのインポート

import分を使って下記の標準ライブラリライブラリとTISモジュールを読み込みます。

import sys
import cv2
import numpy as np
import TIS

この時TISモジュールはTIS.pyを読み込むため同じディレクトリに配置してください。
それ以外のディレクトリに配置する場合は下記のように指定する必要があります。

sys.path.append("../python-common")

カメラをオープン

TISクラスを使ってインスタンス化します。

Tis = TIS.TIS()

シリアル番号:16710581 のカメラを幅=640、高さ=480 フレームレート=30fps、GRAY8のフォーマットで開きます。なお、ターミナルのコマンドラインで「tcam-ctrl -f SerialNumber」を入力すれば、出力できるフォーマット一覧を確認できます。

# 幅=640、高さ=480 フレームレート=30fps
# カラーフォーマット GRAY8 、カラーの場合はRGBx (RGB32と同じ)
Tis.openDevice("16710581", 640, 480, "30/1", TIS.SinkFormats.GRAY8,True) 

なお、直接デバイスを指定することなく、コマンドラインで表示されたデバイス、フォーマット、フレームレートを指定する方法は下記の通りです。

Tis.selectDevice() 

Gstreamerでライブストリーミング

上記のプロパティ値を設定後、Tis.Start_pipeline()でライブビデオを開始します。Tis.pyでGStreamerをラップしているのでGStreamerのパイプラインを明示的に記述することなく、カメラがストリーミングできる状態にできます。

Tis.Start_pipeline()  

なお、ターミナルのコマンドラインで「tcam-ctrl -p SerialNumber」を入力すれば、設定できるカメラのプロパティと設定できる範囲の一覧を確認できますが ビューワーソフトtcam-captureにあるすべてのプロパティにアクセスできません。tiscameraモジュールはライブストリーム開始後に、自動的に接続しているカメラの設定項目などを読み込み、不足しているプロパティを追加するように設計されていますので、Start_pipeline()でライブストリームをした後にList_Properties()でプロパティリストを表示してください。

カメラプロパティのリスト一覧を表示

TISモジュールで設定できるプロパティ一覧を表示します。この情報をもとにカメラのプロパティ値の設定を行ってください。プロパティにアクセスするためには【Gstreamerでライブストリーム】開始(Tis.Start_pipeline()をコール)後に、List_Properties()を呼び出す必要があります。

Tis.List_Properties()

実行例
下図の赤線にあるとおり、プロパティ値、型、デフォルト値、設定最小値、設定最大値が表示されます。

カメラプロパティ値の設定

「tcam-ctrl -p 16710581」で設定範囲を確認した後、下記のようにカメラのプロパティを設定します。
なお、USBやGigEなどカメラのモデルによって多少プロパティ名称が異なっておりますので(例:"Exposure Time (us)"やExposureなど)Tis.List_Propertiesメソッドで表示されたプロパティをもとにSet_Propertyの引数の設定を行ってください。
なお、ゲイン・露光時間・ホワイトバランスを固定化するには必ずそれぞれの自動設定をOFFにする必要があります。
下記ではゲイン・露光時間・ホワイトバランスの自動調整をOFFにして任意のパラメータに設定をしています。

### USB2.0の場合 カメラプロパティ設定
# Tis.List_Properties()で出力されたプロパティ値を確認した上で引数に渡してください。
# errorが出る場合はコメントアウトしてください。
Tis.Set_Property("Gain Auto",False) # ゲインを固定化するために自動ゲインをオフにする
Tis.Set_Property("Gain", 18)
Tis.Set_Property("Exposure Auto", False) # 露光時間を固定化するために自動露光時間をオフにする
Tis.Set_Property("Exposure", 11000)
Tis.Set_Property("whitebalance-auto", False) # ホワイトバランスを固定化するために自動ホワイトバランス調整をオフにする
Tis.Set_Property("camera-whitebalance", True) # ホワイトバランスを調整するためにTrueにする
Tis.Set_Property("whitebalance-red", 72) #tcam-captureで調整した値を入力してください。
Tis.Set_Property("whitebalance-blue", 102)
Tis.Set_Property("whitebalance-green", 64)
### USB3.0の場合 カメラプロパティ設定
# Tis.List_Properties()で出力されたプロパティ値を確認した上で引数に渡してください。
# errorが出る場合はコメントアウトしてください。
Tis.Set_Property("Gain Auto",False) # ゲインを固定化するために自動ゲインをオフにする
Tis.Set_Property("Gain", 0)
Tis.Set_Property("Exposure Auto", False) # 露光時間を固定化するために自動露光時間をオフにする
Tis.Set_Property("Exposure Time (us)", 11000)
Tis.Set_Property("Whitebalance Auto", False) # ホワイトバランスを固定化するために自動ホワイトバランス調整をオフにする
Tis.Set_Property("Whitebalance Red", 125)
Tis.Set_Property("Whitebalance Blue", 124)
Tis.Set_Property("Whitebalance Green", 123)
### GigEの場合 カメラプロパティ設定
# Tis.List_Properties()で出力されたプロパティ値を確認した上で引数に渡してください。
# errorが出る場合はコメントアウトしてください。
Tis.Set_Property("Gain Auto","Off") # ゲインを固定化するために自動ゲインをオフにする
Tis.Set_Property("Gain", 30) 
Tis.Set_Property("Exposure Auto", "Off") # 露光時間を固定化するために自動露光時間をオフにする
Tis.Set_Property("Exposure", 11000)
Tis.Set_Property("Whitebalance Auto", "Off") # ホワイトバランスを固定化するために自動ホワイトバランス調整をオフにする
Tis.Set_Property("Balance Ratio Selector", "Red")
Tis.Set_Property("Balance Ratio", 2.0)
Tis.Set_Property("Balance Ratio Selector", "Blue")
Tis.Set_Property("Balance Ratio", 1.9)
Tis.Set_Property("Balance Ratio Selector", "Green")
Tis.Set_Property("Balance Ratio", 1.8)

設定が反映されているか確認

上記のSet_Propertyで未反映の場合でも返り値としてエラーを表示しないので デバッグ段階では下記のようなGet_Propertyを使って、設定した値が反映されているのか確認します。

### USB2.0の場合、設定が反映されているか確認
# Tis.List_Properties()で出力されたプロパティ値を確認した上で引数に渡してください。
# errorが出る場合はコメントアウトしてください。
print("Gain Auto : %s " % Tis.Get_Property("Gain Auto").value)
print("Gain : %d" % Tis.Get_Property("Gain").value)
print("Exposure Auto : %s " % Tis.Get_Property("Exposure Auto").value)
print("Exposure Time (us) : %d" % Tis.Get_Property("Exposure").value)
print("Whitebalance Auto : %s " % Tis.Get_Property("whitebalance-auto").value)
print("Whitebalance Red : %d " % Tis.Get_Property("whitebalance-red").value)
print("Whitebalance Blue : %d " % Tis.Get_Property("whitebalance-blue").value)
print("Whitebalance Green : %d " % Tis.Get_Property("whitebalance-green").value)
### USB3.0の場合 カメラプロパティ設定が反映されているか確認
# Tis.List_Properties()で出力されたプロパティ値を確認した上で引数に渡してください。
# errorが出る場合はコメントアウトしてください。
print("Gain Auto : %s " % Tis.Get_Property("Gain Auto").value)
print("Gain : %d" % Tis.Get_Property("Gain").value)
print("Exposure Auto : %s " % Tis.Get_Property("Exposure Auto").value)
print("Exposure Time (us) : %d" % Tis.Get_Property("Exposure Time (us)").value)
print("Whitebalance Auto : %s " % Tis.Get_Property("Whitebalance Auto").value)
print("Whitebalance Red : %d " % Tis.Get_Property("Whitebalance Red").value)
print("Whitebalance Blue : %d " % Tis.Get_Property("Whitebalance Blue").value)
print("Whitebalance Green : %d " % Tis.Get_Property("Whitebalance Green").value)
### GigEの場合 カメラプロパティ設定が反映されているか確認
# Tis.List_Properties()で出力されたプロパティ値を確認した上で引数に渡してください。
# errorが出る場合はコメントアウトしてください。
print("Gain Auto : %s " % Tis.Get_Property("Gain Auto").value)
print("Gain : %d" % Tis.Get_Property("Gain").value)
print("Exposure Auto : %s " % Tis.Get_Property("Exposure Auto").value)
print("Exposure Time (us) : %d" % Tis.Get_Property("Exposure").value)
print("Whitebalance Auto : %s " % Tis.Get_Property("Whitebalance Auto").value)
Tis.Set_Property("Balance Ratio Selector", "Red")
print("Whitebalance Red : " ,Tis.Get_Property("Balance Ratio").value)
Tis.Set_Property("Balance Ratio Selector", "Blue")
print("Whitebalance Blue :  " ,Tis.Get_Property("Balance Ratio").value)
Tis.Set_Property("Balance Ratio Selector", "Green")
print("Whitebalance Green : " ,Tis.Get_Property("Balance Ratio").value)

画像取得、画像処理

ストリーミング画像を表示するために下記のようにwhile文内に下記のようにコーディングします。Get_imageで画像を取得し、その後、OpenCVで画像処理をし(ここでは例としてerode関数を使って2値化処理を行ってます)、ライブ表示、取得した画像を保存を行っています。

#Timeout設定時間(1秒)以内にPCに画像を取得できた場合次の処理へ進む
if Tis.Snap_image(1) is True: 
        image = Tis.Get_image()  # イメージを取得
        # OpenCV で画像処理
        image = cv2.erode(image, kernel, iterations=5)  
        #画像を0.5倍に縮小リサイズしimage _resizeに代入
        height = image.shape[0]
        width = image.shape[1]
        image _resize = cv2.resize(image, (int(width*0.5), int(height*0.5)))
        # 画像処理後の画像を表示
        cv2.imshow('Window', image _resize)
        # Jpegファイルの名称にインデックス番号を付与するためにフレームの数をカウント
        imagecounter += 1
        filename = "./image{:04}.jpg".format(imagecounter)
        # Jpeg画像を保存
        cv2.imwrite(filename, image)

lastkey = cv2.waitKey(10)

ターミナルでの実行結果

python3 OpenCVsample.py

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