Spinnaker SDKでFLIRのカメラをPythonから動かす
FLIRのSpinnaker SDKではC/C++,Pythonといった主要なプログラミング言語をサポートしています.ここではPythonを使ってFLIRのカメラを動かすための具体的な方法を説明します.
Spinnaker SDKのインストール方法はこちらを参考にしてください.
PySpinのインストール
Spinnaker SDKをPythonから使うためには,PySpinをインストールする必要があります.
numpyとmatplotlibをインストールしてない場合は,pipでインストールします.Pillowは無くても動きますが,あった方が良いみたいです.
MacOS
- /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のバージョンです.
- 解凍したフォルダ内にある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 cam
やcam_list.Clear()
)の部分で,これが実行されない場合エラーになります.
numpy配列への変換
image_NDArray = image_result.GetNDArray()
PySpinでは撮影した画像をnumpy配列に変換することができます.そのため,opencvやnumpyとの連携が容易です.
撮影の設定
カメラのパラメータを設定をするにはQuickSpinAPIかGenAPI(GenICamAPI)を使います.QuickSpinAPIは,ほとんどのパラメータがサポートされていて,GenAPIより短いコードで実行できます.そのため,基本的にはQuickSpinAPIを使えば良いです. ここでは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