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

HDRを有効化してライブ表示

概要

HDRの機能を有効化しライブ表示をする方法について解説します。
HDRとはHigh Dynamic Rangeの略で、明るさの違う画像を合成することで暗所の画像と明るい画像を同時に撮影することができる機能です。
「Tone Mapping」と呼ばれる元の明るさの色を別の明るさの色にマッピングする手法を使って、ダイナミックレンジを高めています。

開発環境

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

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

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

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

TIS.py

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

python-tonemapping.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
#TIS.pyを別フォルダに格納吸う場合は下記のように記載
#sys.path.append("../python-common")

import cv2
import numpy as np
import TIS
import time

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

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

カメラをオープン

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

Tis = TIS.TIS()

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

# 幅=640、高さ=480 フレームレート=30fps
# カラーフォーマット BGRA
Tis.openDevice("16710581", 640, 480, "30/1", TIS.SinkFormats.BGRA,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()

上記を実行することで下記のようにTone Mapping機能があることが分かります。

カメラプロパティ値の設定(HDR機能の有効化)

下記のようにカメラにHDR機能の設定を有効化します。
なお、バージョンによって多少プロパティ名称が異なることがありますのでTis.List_Propertiesメソッドで表示されたプロパティをもとにSet_Propertyの引数の設定を行ってください。

Tis.Set_Property("Tonemapping", True)
Tis.Set_Property("Tonemapping Global Brightness", 0.0)
Tis.Set_Property("Tonemapping Intensity", 1.0)
print("Tonemapping : " ,Tis.Get_Property("Tonemapping").value)
print("Tonemapping Global Brightness : " ,Tis.Get_Property("Tonemapping Global Brightness").value)
print("Tonemapping Intensity : " ,Tis.Get_Property("Tonemapping Intensity").value)

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

画像保存

ストリーミング画像を保存するために下記のようにwhile文内に下記のようにコーディングします。Get_imageで画像を取得し、その後、取得した画像を保存を行っています。

print('Press Esc to stop')
lastkey=0
imagecounter=0
while lastkey != 27:
        #Timeout設定時間(1秒)以内にPCに画像を取得できた場合次の処理へ進む
        if Tis.Snap_image(1) is True:  # Snap an image with one second timeout
                # 画像取得
                image = Tis.Get_image() 
                imagecounter += 1
                filename = "./image{:04}.png".format(imagecounter)
                # Jpeg画像を保存
                cv2.imwrite(filename, image)
        lastkey = cv2.waitKey(10)

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

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

ターミナルでの実行

python3 OpenCVsample.py