1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【撮影条件を再現】Baslerカメラの設定を保存・読み込みする方法【pfs活用 / pylon SDK × C#】

Posted at

【撮影条件を再現】Baslerカメラの設定を保存・読み込みする方法【pfs活用 / pylon SDK × C#】

撮影条件を再現したいときや、複数パターンの設定を切り替えたいとき、
Baslerカメラの設定ファイル(pfs)を保存・読み込みできると非常に便利です。

本記事では、pylon SDK を用いて .pfs 形式でカメラの設定を保存・復元する方法を紹介します。


PFS形式とは

PFSファイルとは、pylon Feature Stream file の略で、Basler製カメラの設定を保存・読み込みに使えます。

✅ 利用場面

  1. 設定のバックアップ
    • 一度決めたカメラ条件を保存 → 別のPCや再起動後に再現
  2. 実験条件の共有
    • 研究室や製造ラインで「同じ条件で撮影する」ために配布
  3. ソフトウェアからの読み込み
    • 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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?