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

【入門編】Linuxでtiscameraの開発環境を構築

目的、概要

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,tiscamera1.0.0

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,tiscamera1.0.0

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

サンプルデータはPCにてダウンロードをお願いいたします。
モバイルサイトではご利用いただけません。

実行結果

コード全体

import sys
import cv2
import numpy as np
#TIS.pyを別フォルダに格納する場合は下記のように記載
#sys.path.append("../python-common")

import TIS

# このサンプルはカメラからのイメージ取得とOpenCVで画像処理する一連の処理する方法を記載しています。
# 必要なパッケージ:
# pyhton-opencv
# pyhton-gst-1.0
# tiscamera

Tis = TIS.TIS()

# DMK 33UX264 Serial: 16710581 、 解像度640x480@30 fpsで表示する
# selectDeviceを使ってデバイスをOpenするためコメントアウトしています
# Tis.openDevice("16710581", 640, 480, "30/1", TIS.SinkFormats.BGRA,True)

###GigEの場合 カメラプロパティ設定
#Tis.List_Properties()で出力されたプロパティ値を引数に渡してください。
# errorが出る場合はコメントアウトしてください。

#selectDeviceを利用することでデバイスの選択、フォーマット、フレームレートをコマンドラインで指定できる
if not Tis.selectDevice():
    quit(0)

#tcam-ctrl -p <serial>で出力されたプロパティ値を引数に渡してください。
# errorが出る場合はコメントアウトしてください。
Tis.Set_Property("GainAuto","Off")# ゲインを固定化するために自動ゲインをオフにする
Tis.Set_Property("Gain", 9.6)
Tis.Set_Property("ExposureAuto", "Off")# 露光時間を固定化するために自動露光時間をオフにする
Tis.Set_Property("ExposureTime", 2977)
Tis.Set_Property("BalanceWhiteAuto", "Off")# ホワイトバランスを固定化するために自動ホワイトバランス調整をオフにする
Tis.Set_Property("BalanceWhiteRed", 1.0)
Tis.Set_Property("BalanceWhiteBlue", 1.0)
Tis.Set_Property("BalanceWhiteGreen", 1.0)
Tis.Set_Property("TriggerMode","Off")

#tcam-ctrl -p <serial>で出力されたプロパティ値を引数に渡してください。
# errorが出る場合はコメントアウトしてください。

print("Gain Auto : %s " % Tis.Get_Property("GainAuto"))
print("Gain : %d" % Tis.Get_Property("Gain"))
print("Exposure Auto : %s " % Tis.Get_Property("ExposureAuto"))
print("Exposure Time (us) : %d" % Tis.Get_Property("ExposureTime"))
print("Whitebalance Auto : %s " % Tis.Get_Property("BalanceWhiteAuto"))
print("Whitebalance Red : " ,Tis.Get_Property("BalanceWhiteRed"))
print("Whitebalance Blue :  " ,Tis.Get_Property("BalanceWhiteBlue"))
print("Whitebalance Green : " ,Tis.Get_Property("BalanceWhiteGreen"))

#Gstreamerでの映像伝送
Tis.Start_pipeline()  

print('Press Esc to stop')
lastkey = 0

cv2.namedWindow('Window') 

# OpenCVのerode関数で使う引数
kernel = np.ones((5, 5), np.uint8)  

#カウンター初期化
imagecounter=0

while lastkey != 27:
    #Timeout設定時間(1秒)以内にPCに画像を取得できた場合次の処理へ進む
    if Tis.Snap_image(1) is True: 
        # 画像取得
        image = Tis.Get_image() 
        # OpenCV で画像処理
        image = cv2.erode(image, kernel, iterations=5) 
        #画像処理後の画像を表示
        cv2.imshow('Window', image) 

        #Jpegファイルの名称にインデックス番号を付与するためにフレームの数をカウント
        imagecounter += 1
        filename = "./image{:04}.jpg".format(imagecounter)
        #Jpeg画像を保存(コメントアウトしています)
        #cv2.imwrite(filename, image)
    lastkey = cv2.waitKey(10)

# Gstreamerのパイプラインを停止
Tis.Stop_pipeline()
cv2.destroyAllWindows()
print('Program ends')

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

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()でプロパティリストを表示してください。

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

「tcam-ctrl -p <シリアル番号>」で設定範囲を確認した後、コマンドラインで表示されたカメラのプロパティを設定します。

例:

なお、ゲイン・露光時間・ホワイトバランスを固定化するには必ずそれぞれの自動設定をOFFにする必要があります。
下記ではゲイン・露光時間・ホワイトバランスの自動調整をOFFにして任意のパラメータを設定しています。

#tcam-ctrl -p <serial>で出力されたプロパティ値を引数に渡してください。
# errorが出る場合はコメントアウトしてください。
Tis.Set_Property("GainAuto","Off")# ゲインを固定化するために自動ゲインをオフにする
Tis.Set_Property("Gain", 9.6)
Tis.Set_Property("ExposureAuto", "Off")# 露光時間を固定化するために自動露光時間をオフにする
Tis.Set_Property("ExposureTime", 2977)

# モノクロカメラの場合下記、コメントアウトしてください
Tis.Set_Property("BalanceWhiteAuto", "Off")# ホワイトバランスを固定化するために自動ホワイトバランス調整をオフにする
Tis.Set_Property("BalanceWhiteRed", 1.0)
Tis.Set_Property("BalanceWhiteBlue", 1.0)
Tis.Set_Property("BalanceWhiteGreen", 1.0)

Tis.Set_Property("TriggerMode","Off") #トリガーモードOFFにする

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

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

#tcam-ctrl -p <serial>で出力されたプロパティ値を引数に渡してください。
# errorが出る場合はコメントアウトしてください。

print("Gain Auto : %s " % Tis.Get_Property("GainAuto"))
print("Gain : %d" % Tis.Get_Property("Gain"))
print("Exposure Auto : %s " % Tis.Get_Property("ExposureAuto"))
print("Exposure Time (us) : %d" % Tis.Get_Property("ExposureTime"))

# モノクロカメラの場合下記、コメントアウトしてください
print("Whitebalance Auto : %s " % Tis.Get_Property("BalanceWhiteAuto"))
print("Whitebalance Red : " ,Tis.Get_Property("BalanceWhiteRed"))
print("Whitebalance Blue :  " ,Tis.Get_Property("BalanceWhiteBlue"))
print("Whitebalance Green : " ,Tis.Get_Property("BalanceWhiteGreen"))

画像取得、画像処理

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

#カウンター初期化
imagecounter=0

while lastkey != 27:
    #Timeout設定時間(1秒)以内にPCに画像を取得できた場合次の処理へ進む
    if Tis.Snap_image(1) is True: 
        # 画像取得
        image = Tis.Get_image() 
        # OpenCV で画像処理
        image = cv2.erode(image, kernel, iterations=5) 
        #画像処理後の画像を表示
        cv2.imshow('Window', image) 

        #Jpegファイルの名称にインデックス番号を付与するためにフレームの数をカウント
        imagecounter += 1
        filename = "./image{:04}.jpg".format(imagecounter)
        #Jpeg画像を保存(コメントアウトしています)
        #cv2.imwrite(filename, image)
    lastkey = cv2.waitKey(10)

ターミナルでの実行結果

python3 OpenCVsample.py