0
0

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 pylon SDKでフレームレートを制御・確認する【C# / .NET対応】

Posted at

Basler pylon SDKでフレームレートを制御・確認する【C# / .NET対応】

画像処理やカメラ制御アプリを作るとき、「1秒間に何枚撮れるか?」= フレームレート(fps) が気になることがあります。

特に製造ラインなどでリアルタイムに処理したいときには、設定通りに撮れているのかを知る必要があります。

この記事では、フレームレートを設定し、実際にその速度で撮れているかを確認する方法を紹介します。


📦 環境

項目 内容
カメラ Basler acA2500-14gm
SDK pylon Camera Software Suite
言語 C# / .NET 8.0 (Windows)

💡 AcquisitionFrameRateResultingFrameRate の違い

パラメータ 説明
AcquisitionFrameRate ユーザーが設定する目標フレームレート(希望値)
ResultingFrameRate 実際に達成できるフレームレート(カメラが計算)

🔧 フレームレート設定の有効化

まず、設定を有効にする必要があります。

前回記事(Basler pylon SDKでゲイン(Gain)を手動制御する)で紹介したBaslerCameraSampleクラスに、以下の機能を追加していきます。
BaslerCameraSampleクラスはBaslerのpylon SDKでカメラ画像を1枚取得する方法で紹介しているので、こちらも参考にしてください。


/// <summary>
/// カメラのフレームレートを有効または無効にします。
/// フレームレートを有効にすると、カメラは指定されたフレームレートで画像を取得します。
/// 無効にすると、カメラは自動的に最大許容フレームレートで動作します。
/// </summary>
public bool EnableFrameRate(bool enable)
    => SetPLCameraParameter(PLCamera.AcquisitionFrameRateEnable, enable);

サポート関数

AcquisitionFrameRateEnableのInterface TypeはIBooleanであるため、以下のようなサポート関数も用意します。

public bool SetPLCameraParameter(BooleanName parameter, bool value)
{
    if (Camera == null || !IsConnected)
        return false;

    if (Camera.Parameters[parameter].IsWritable)
    {
        Camera.Parameters[parameter].SetValue(value);
        Console.WriteLine($"{parameter} set to {value}.");
        return true;
    }
    else
    {
        Console.WriteLine($"{parameter} is not writable.");
        return false;
    }
}

🔧 フレームレート設定

public bool SetFrameRate(double frameRate)
    => SetPLCameraParameter(PLCamera.AcquisitionFrameRateAbs, frameRate);

この設定により、1秒間に最大frameRate枚撮影するようカメラに指示できます。

カメラによっては AcquisitionFrameRate ではなく AcquisitionFrameRateAbs という名前になっています。

💡 機種によって異なります。Pylon Viewer または Camera.Parameters.Contains(...) を使って使用可能なパラメータを確認してください。


📏 設定フレームレートと実測フレームレートを取得する

設定しても必ずしもその速度が出るとは限りません。
ResultingFrameRateAbs は「現在カメラが実際に達成しているフレームレート(実効値)」を示します。

この値を取得して、設定した値と一致しているかを確認します。

public double GetFrameRate()
    => GetPLCameraParameter(PLCamera.AcquisitionFrameRateAbs);


/// <summary>
/// カメラが現在実際に取得しているフレームレートを示します。
/// </summary>
public double GetResultingFrameRate()
    => GetPLCameraParameter(PLCamera.ResultingFrameRateAbs);

🚧 フレームレート上限に影響する要素

1. 画像サイズ(ROI)

  • センサ全体 vs 一部だけ(ROI)
  • 読み出しピクセル数が減ると最大fpsが増える

2. 露光時間

  • 長すぎると次のフレームが撮れない
  • 例:ExposureTime = 50000μs(=50ms)なら、最大20fpsが限界

3. インターフェース帯域

  • USB3やGigEの帯域により制限
  • 例:フル解像度+24bitカラーは帯域を圧迫

📝 フレームレートを設定しても反映されないときは?

AcquisitionFrameRate を設定しても期待通りのフレームレートにならない場合、
AcquisitionFrameRateEnablefalse のままになっていないかを確認しましょう。

このパラメータが false の場合、ユーザーの設定値は無視されて、
カメラが自動的に最大許容フレームレートで動作します。

// フレームレート設定が反映されない例(Enable = false)
_baslerCameraSample.EnableFrameRate(false);
_baslerCameraSample.SetFrameRate(15); // 無効化されている。

// 実際には自動計算されたfpsになる
double fps = _baslerCameraSample.GetResultingFrameRate();

明示的に AcquisitionFrameRateEnable = true に設定しないと、AcquisitionFrameRate の値は有効になりません。


🧪 設定値と実際のfpsを比較してみる

以下のテストでは、5 / 15 / 30 fps を順に設定して、実際に ResultingFrameRate がどう変化するかを検証しています。

[TestMethod()]
public void SetFrameRateTest()
{
    _baslerCameraSample.Connect();
    // フレームレートを有効にする。
    _baslerCameraSample.EnableFrameRate(true);

    bool isSetfps = _baslerCameraSample.SetFrameRate(5);  // 5fps
    Assert.IsTrue(isSetfps);
    // フレームレートがぴったり一致するとは限らない。
    var framerate1 = _baslerCameraSample.GetFrameRate();
    Assert.IsTrue(Math.Abs(framerate1 - 5) < 0.1);

    bool isSet15fps = _baslerCameraSample.SetFrameRate(15); // 15fps
    Assert.IsTrue(isSet15fps);
    var framerate2 = _baslerCameraSample.GetFrameRate();
    Assert.IsTrue(Math.Abs(framerate2 - 15) < 0.1);

    bool isSet30fps = _baslerCameraSample.SetFrameRate(30); // 30fps
    Assert.IsTrue(isSet30fps);
    var framerate3 = _baslerCameraSample.GetFrameRate();
    Assert.IsTrue(Math.Abs(framerate3 - 30) < 0.1);

    var resultingFramerate = _baslerCameraSample.GetResultingFrameRate();
    // 実測値と設定を比較する。
    Assert.AreNotEqual(framerate3, resultingFramerate);
    Console.WriteLine($"Frame Rate: {framerate3:F2} fps, Resulting Frame Rate: {resultingFramerate:F2} fps");
    // → 例: 14.59 fps が返ってくる  
    // これは 30fps を設定しても、**ROIが大きすぎる・露光が長い・帯域が不足している**などの要因で制限がかかっている可能性があります。
}

テストを実行すると、私の環境では以下のような標準出力が返ってきました。
最後の行をみると、30fps を設定したとき、実測値が約14.6fps に下がっています。
これは帯域やROIの制約が影響していると考えられます。

Camera connected successfully.
@CameraDevice/AcquisitionFrameRateEnable set to True.
@CameraDevice/AcquisitionFrameRateAbs set to 5.
@CameraDevice/AcquisitionFrameRateAbs value: 5
@CameraDevice/AcquisitionFrameRateAbs set to 15.
@CameraDevice/AcquisitionFrameRateAbs value: 14.999925000374999
@CameraDevice/AcquisitionFrameRateAbs set to 30.
@CameraDevice/AcquisitionFrameRateAbs value: 30.00030000300003
@CameraDevice/ResultingFrameRateAbs value: 14.592149423610099
Frame Rate: 30.00 fps, Resulting Frame Rate: 14.59 fps

🧭 よくあるトラブルと対処法

症状 原因・対策
設定してもフレームレートが上がらない 露出が長い・画像サイズが大きすぎる
AcquisitionFrameRate が設定できない AcquisitionFrameRateEnable = false のまま
ResultingFrameRate が取れない カメラ未接続・初期化不足

📝 まとめ

  • AcquisitionFrameRateEnable を true にしないとフレームレート設定は有効になりません。
  • 実際に設定が反映されたかは ResultingFrameRateAbs で確認できます。
  • 今後、露出やROIとの組み合わせで処理の安定性・高速化にもつなげられます。

フレームレートの設定と確認は、産業カメラの安定運用において重要です。
特に、露出・ROI・帯域と組み合わせて全体設計することで、カメラの最大性能を引き出すことができます。


🔜 次回予告

次回は、フレームレート設定を活かした**連続撮影(バーストキャプチャ)**の実装を紹介します。
リアルタイム処理や製造ラインでの検査など、産業用途で役立つノウハウです。


筆者:@MilleVision

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?