あらいさん日記(仮)

あらい日記

活動の記録

Spinnaker SDKでFLIRのカメラをPythonから動かす

FLIRのSpinnaker SDKではC/C++,Pythonといった主要なプログラミング言語をサポートしています.ここではPythonを使ってFLIRのカメラを動かすための具体的な方法を説明します.

Spinnaker SDKのインストール方法はこちらを参考にしてください.

PySpinのインストール

Spinnaker SDKPythonから使うためには,PySpinをインストールする必要があります.
numpyとmatplotlibをインストールしてない場合は,pipでインストールします.Pillowは無くても動きますが,あった方が良いみたいです.

MacOS

  1. /Applications/Spinnaker/PySpin内にあるspinnaker_python-2.0.0.109-cp37-cp37m-macosx_10_9_x86_64.tar.gzを解凍します.2.0.0.109はSpinnaker SDKのバージョン,cp37はPythonのバージョンです.
  2. 解凍したフォルダ内にあるPySpinのwheelをインストールします.
    pip install spinnaker_python-2.0.0.109-cp37-cp37m-macosx_10_9_x86_64.whl

PySpinの使用例

FLIRが配布しているコードの中には,PySpinのexamplesがありますが,なぜか非常に複雑です.ここではPySpinを使うためのコードを要点を絞って紹介します.

撮影・保存

import PySpin

#カメラの指定・初期化
system = PySpin.System.GetInstance()
cam_list = system.GetCameras()
cam = cam_list.GetByIndex(0)
cam.Init()

#撮影開始
cam.BeginAcquisition()

#カメラから画像を転送&保存
image_result = cam.GetNextImage()
image_converted = image_result.Convert(PySpin.PixelFormat_Mono8, PySpin.HQ_LINEAR)
image_converted.Save("image.png")
image_result.Release()

#撮影終了
cam.EndAcquisition()

#終了処理
del cam
cam_list.Clear()
system.ReleaseInstance()

注意したいのは終了処理(特にdel camcam_list.Clear())の部分で,これが実行されない場合エラーになります.

numpy配列への変換

image_NDArray = image_result.GetNDArray()

PySpinでは撮影した画像をnumpy配列に変換することができます.そのため,opencvやnumpyとの連携が容易です.

撮影の設定

カメラのパラメータを設定をするにはQuickSpinAPIかGenAPI(GenICamAPI)を使います.QuickSpinAPIは,ほとんどのパラメータがサポートされていて,GenAPIより短いコードで実行できます.そのため,基本的にはQuickSpinAPIを使えば良いです.

f:id:raccoon15:20200430093255p:plain
設定できるパラメータはSpinViewの左下のメニュー(Features)から確認できる
ここではQuickSpinAPIを使った各種パラメータの設定方法を紹介します.

露光時間

#Auto exposureをon (continuousモード)
cam.ExposureAuto.SetValue(PySpin.ExposureAuto_Continuous)

#Auto exposureをoff
cam.ExposureAuto.SetValue(PySpin.ExposureAuto_Off)
#Exposure modeをTimedに設定
cam.ExposureMode.SetValue(PySpin.ExposureMode_Timed)
#Exposure timeを20000usに設定
cam.ExposureTime.SetValue(20000)

#設定されているexposure timeを取得
value = cam.ExposureTime.GetValue()

ゲイン

#Auto gainをon (continuousモード)
cam.GainAuto.SetValue(PySpin.GainAuto_Continuous)

#Auto gainをoff
cam.GainAuto.SetValue(PySpin.GainAuto_Off)
#Gainを10.5dBに設定
cam.Gain.SetValue(10.5)

#設定されているGainを取得
value = cam.Gain.GetValue()

ガンマ

#Gammaを1.5に設定
cam.Gamma.SetValue(1.5)

#設定されているGammaを取得
value = cam.Gamma.GetValue()

黒レベル

#BlackLevelSelectorをAllに設定
cam.BlackLevelSelector.SetValue(PySpin.BlackLevelSelector_All)
#BlackLevelを1.5%に設定
cam.BlackLevel.SetValue(1.5)

#設定されているBlackLevelを取得
value = cam.BlackLevel.GetValue()

転送する画像の順番

#GenAPI
#転送する画像を最新のもの(NewestOnly)に設定
s_node_map = self.cam.GetTLStreamNodeMap()
handling_mode = PySpin.CEnumerationPtr(s_node_map.GetNode('StreamBufferHandlingMode'))
handling_mode_entry = handling_mode.GetEntryByName('NewestOnly')
handling_mode.SetIntValue(handling_mode_entry.GetValue())

webカメラのように撮影した画像をリアルタイムで確認したい場合は,StreamBufferHandlingModeをNewestOnlyに設定して,最新の画像のみを転送してくるようにします.OldestFirstに設定すると,カメラ内のバッファに保存されている古い画像から順に転送されます.

OpenCVのVideoCaptureクラスっぽく使う

PySpinはカメラの詳細な設定をできますが,それ故に複雑で独特なコーディングになりがちです.一方で,OpenCVのVideoCaptureクラスは簡素なコードでwebカメラを動かすことができます.そこで,OpenCVのVideoCaptureクラスっぽいコードで,FLIRのカメラを動かすためのラッパーを作ってみました.複雑なコードでお困りの方は使ってみてください. github.com