【撮影条件を再現】Baslerカメラの設定を保存・読み込みする方法【pfs活用 / pylon SDK × C#】
撮影条件を再現したいときや、複数パターンの設定を切り替えたいとき、
Baslerカメラの設定ファイル(pfs)を保存・読み込みできると非常に便利です。
本記事では、pylon SDK を用いて .pfs
形式でカメラの設定を保存・復元する方法を紹介します。
PFS形式とは
PFSファイルとは、pylon Feature Stream file の略で、Basler製カメラの設定を保存・読み込みに使えます。
✅ 利用場面
- 設定のバックアップ
- 一度決めたカメラ条件を保存 → 別のPCや再起動後に再現
- 実験条件の共有
- 研究室や製造ラインで「同じ条件で撮影する」ために配布
- ソフトウェアからの読み込み
-
camera.Parameters.Load("config.pfs")
で即座に設定を反映可能(後述)
-
✅ 使用環境
項目 | 内容 |
---|---|
カメラ | Basler acA2500-14gm |
SDK | pylon Camera Software Suite |
言語 | C# / .NET 8 |
保存形式 | .pfs(Pylon Feature Set) |
📝 カメラ設定を保存する(Save)
それでは、今回も前回記事(Baslerカメラ画像をOpenCVで表示・保存する)で紹介したBaslerCameraSample
クラスに、以下の機能を追加していきます。
BaslerCameraSample
クラスはBaslerのpylon SDKでカメラ画像を1枚取得する方法で紹介しているので、こちらも参考にしてください。
早速ですが、設定の保存にはCamera.Parameters.Save()
メソッドが使えます。以下のコードはCameraDevice
の設定を保存します。引数のParameterPath
には直接パラメータを指定したり、ParameterPath
クラスのプロパティを渡すことができます。
using Basler.Pylon;
namespace BaslerSamples
{
public static class BaslerCameraSample
{
public void SaveCameraDeviceParameters(string filePath)
{
if (Camera == null || !IsConnected)
throw new InvalidOperationException("Camera is not connected.");
if (string.IsNullOrWhiteSpace(filePath))
throw new ArgumentException("File path cannot be null or empty.", nameof(filePath));
Camera.Parameters.Save(filePath, ParameterPath.CameraDevice);
Console.WriteLine($"Camera settings saved to {filePath}");
}
}
}
実用上、CameraDevice
だけ保存すれば十分ですが、一気にデバイスの設定を保存したいときはリフレクション文字列のプロパティを取得しforeach
で列挙する方法があります。
Camera.Parameters.Contains(value)で存在確認はしていますが、カメラ側の仕様変更や一部非対応プロパティによりSave()で例外が発生することもあります。その際、ArgumentException
が発生するためcatch
してスキップします。
ただし、例外を活用する方法はあまりいい方法とはいえないため、よりよい方法をご存じの方はアドバイスいただければと思います。
public void SaveAllParameters(string directory)
{
var t = typeof(ParameterPath);
var stringProps = t
.GetProperties(BindingFlags.Public | BindingFlags.Static)
.Where(p => p.PropertyType == typeof(string));
foreach (var prop in stringProps)
{
// static プロパティなので GetValue の第1引数は null
string value = (string)(prop.GetValue(null) ?? string.Empty);
if (!string.IsNullOrEmpty(value) && Camera.Parameters.Contains(value))
{
string filePath = System.IO.Path.Combine(directory, $"{value}.pfs");
try
{
Camera.Parameters.Save(filePath, value);
}
catch (ArgumentException)
{
// パラメータが存在しない場合はスキップ
continue;
}
Console.WriteLine($"Saved {value} to {filePath}");
}
}
Console.WriteLine($"Camera settings saved to {directory}");
}
📂 保存されたファイルの例(pfs)
pfsファイルの中身をエディタで確認すると、設定値が保存されていることがわかります。
pfs
ファイルはタブ区切りのTSV
形式です。主要なパラメータはCameraDevice
に集まっているため、基本的にはこれだけ保存しておけば十分なことが多いです。
ExposureMode Timed // 露光モード
ExposureAuto Off // 自動露光オフ(手動設定)
ExposureTimeRaw 35000 // 単位はμs
AcquisitionFrameRateEnable 1 // フレームレート設定有効
AcquisitionFrameRateAbs 30.0003 // フレームレート設定
📥 設定を読み込む(Load)
次に保存したpfs
ファイルをカメラに読み込ませます。
public bool LoadCameraDeviceParameters(string filePath)
{
if (Camera == null || !IsConnected)
throw new InvalidOperationException("Camera is not connected.");
if (string.IsNullOrWhiteSpace(filePath))
throw new ArgumentException("File path cannot be null or empty.", nameof(filePath));
try
{
Camera.Parameters.Load(filePath, ParameterPath.CameraDevice);
Console.WriteLine($"Camera settings loaded from {filePath}");
return true;
}
catch (Exception ex)
{
Console.WriteLine($"Failed to load camera settings: {ex.Message}");
return false;
}
}
実行例
保存と読み込みのテストコードを以下に示します。カメラのフレームレートは読み込んだ設定ファイルの値になっていることがわかります。
[TestMethod()]
public void LoadCameraDeviceSettingsTest()
{
if (!_baslerCameraSample.IsConnected)
_baslerCameraSample.Connect();
// 例としてフレームレートを変更する。
_baslerCameraSample.EnableFrameRate(true);
_baslerCameraSample.SetFrameRate(10); // 10fps
// 設定を保存する。
_baslerCameraSample.SaveCameraDeviceParameters("LoadCameraDeviceSettingsTest.pfs");
_baslerCameraSample.SetFrameRate(15); // 15fps
_baslerCameraSample.LoadCameraDeviceParameters("LoadCameraDeviceSettingsTest.pfs");
var loadedFrameRate = _baslerCameraSample.GetFrameRate();
Assert.AreEqual(10, loadedFrameRate, "Loaded frame rate should be 10fps.");
}
⚠️ 注意点と補足
注意点 | 内容 |
---|---|
保存対象 | カメラの「ユーザーアクセス可能なパラメータ」のみ |
トリガーモードなど一部設定 | デバイス依存の設定は除外されることも |
カメラを変更する場合 | 同じモデルか互換性あるモデル推奨 |
✅ まとめ
-
Camera.Parameters.Save()
/Load()
を使えば、撮影条件を簡単に再現できます -
.pfs
形式は TSVベース - 条件比較や撮影プロファイル管理に非常に便利です
予告
次回は設定つながりで、撮影画像に露光・ゲイン・ROIなどのメタデータを記録する方法をご紹介します。
また、GUIで簡単にカメラ設定を確認・変更できるツールを開発中です。今後紹介予定です。
筆者:@MilleVision