Basler pylon SDKでフレームレートを制御・確認する【C# / .NET対応】
画像処理やカメラ制御アプリを作るとき、「1秒間に何枚撮れるか?」= フレームレート(fps) が気になることがあります。
特に製造ラインなどでリアルタイムに処理したいときには、設定通りに撮れているのかを知る必要があります。
この記事では、フレームレートを設定し、実際にその速度で撮れているかを確認する方法を紹介します。
📦 環境
項目 | 内容 |
---|---|
カメラ | Basler acA2500-14gm |
SDK | pylon Camera Software Suite |
言語 | C# / .NET 8.0 (Windows) |
💡 AcquisitionFrameRate
と ResultingFrameRate
の違い
パラメータ | 説明 |
---|---|
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
を設定しても期待通りのフレームレートにならない場合、
AcquisitionFrameRateEnable
が false
のままになっていないかを確認しましょう。
このパラメータが 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