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 pylon SDKで露出時間を変更する(C# / .NET対応)

Posted at

Basler pylon SDKで露出時間を変更する(C# / .NET対応)

Baslerなどの産業用カメラを使っていて、「画像が暗い」「明るさが安定しない」と感じたことはありませんか?
露出(露光)自動調整機能で画像の明るさが自動で変わってしまうと困ることがあります。
pylon SDKでは、露出(ExposureTime)を手動制御することで、安定した画像取得が可能になります。

本記事では、pylon SDKを使って露出時間(ExposureTime)を手動で設定・取得・検証する方法を紹介します。


✅ 環境

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

💡 補足:GenICamとカメラパラメータ

本記事で使っている Camera.Parameters["ExposureTimeAbs"] などのパラメータは、
GenICam(Generic Interface for Cameras) というカメラインタフェースの標準規格に従っています。

Baslerをはじめ、IDS、FLIR、JAIなど多くの産業用カメラがこの仕様に対応しており、
露出・ゲイン・画像サイズ・トリガーモード などの設定も、共通の方法でアクセスできます。

👉 公式仕様書:GenICam Standard Features Naming Convention (SFNC)

今回はあくまで実用重視のため、GenICamの詳細解説は省略しますが、
他のカメラメーカーに触れる際も同様の手順で操作できることを知っておくと便利です。


🔧 手動で露出を設定するコード

前回記事「Baslerのpylon SDKでカメラ画像を1枚取得する方法」で紹介したBaslerCameraSampleクラスに、以下の機能を追記します。

露出設定用メソッド

// カメラの露出時間を手動で設定する(単位はマイクロ秒)
public bool SetExposure(double exposureTimeUs)
{
    // 自動露出をOFFに設定(手動制御に切り替え)
    if (!SetExposureMode(PLCamera.ExposureAuto.Off))
        return false;

    // 露出時間を設定(例:5000μs = 5ms)
    if (!SetPLCameraParamter(PLCamera.ExposureTimeAbs, exposureTimeUs))
        return false;

    Console.WriteLine($"Exposure time set to {exposureTimeUs} μs.");
    return true;
}

サポート関数

Camera.Parametersに設定したいパラメータを指定し、SetValueメソッドで値を変更します。IsWritabletrueのときにのみ、値が変更できることに注意してください。

// ExposureAutoパラメータを設定("Off", "Once", "Continuous" など)
public bool SetExposureMode(string mode)
    => SetPLCameraParamter(PLCamera.ExposureAuto, mode);

// 文字列値のカメラパラメータを設定する(例:モード指定)
public bool SetPLCameraParamter(ParameterListEnum parameter, string 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;
    }
    Console.WriteLine($"{parameter} is not writable.");
    return false;
}

// 数値値のカメラパラメータを設定する(例:露出時間)
public bool SetPLCameraParamter(FloatName parameter, double 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;
    }
    Console.WriteLine($"{parameter} is not writable.");
    return false;
}

🔍 露出時間を取得する

カメラ側の設定を取得するときは、GetValueメソッドを使います。

// カメラの露出時間(μs)を取得
public double GetExposureTime()
    => GetPLCameraParamter(PLCamera.ExposureTimeAbs);

// 数値パラメータを読み取るユーティリティ関数
public double GetPLCameraParamter(FloatName parameter)
{
    if (Camera == null || !IsConnected)
        throw new InvalidOperationException("Camera is not connected.");

    // 指定したパラメータの値を取得
    if (Camera.Parameters[parameter].IsReadable)
    {
        double value = Camera.Parameters[parameter].GetValue();
        Console.WriteLine($"{parameter} value: {value}");
        return value;
    }
    throw new InvalidOperationException($"{parameter} is not readable.");
}

💡 ExposureAutoとは?

意味
Off 手動制御(今回使う)
Once 一度だけ自動調整して固定
Continuous 常に明るさを自動調整する

📷 実行例:露出時間を変えて撮影・保存

以下のコードでは、5ms(5000μs)と20ms(20000μs), 50ms(50000μs)で画像を取得・保存します。

[TestMethod()]
public void SetExposureTest()
{
    _baslerCameraSample.Connect();

    // 5ms設定・撮影・保存
    _baslerCameraSample.SetExposure(5000);
    var img1 = _baslerCameraSample.SnapToBitmapSource();
    BaslerCameraSample.SaveBitmap(img1, "Exposure_5ms.bmp");
    // 設定値と取得値の誤差チェック(100μs以内)
    // 露光時間がぴったり一致するとは限らない。
    Assert.IsTrue(Math.Abs(_baslerCameraSample.GetExposureTime() - 5000) < 100);

    // 20ms設定・撮影・保存
    _baslerCameraSample.SetExposure(20000);
    var img2 = _baslerCameraSample.SnapToBitmapSource();
    BaslerCameraSample.SaveBitmap(img2, "Exposure_20ms.bmp");
    Assert.IsTrue(Math.Abs(_baslerCameraSample.GetExposureTime() - 20000) < 100);

    // 50ms設定・撮影・保存
    _baslerCameraSample.SetExposure(50000);
    var img3 = _baslerCameraSample.SnapToBitmapSource();
    BaslerCameraSample.SaveBitmap(img3, "Exposure_50ms.bmp");
    Assert.IsTrue(Math.Abs(_baslerCameraSample.GetExposureTime() - 50000) < 100);
}

📊 比較:露出時間による違い(例)

露出5ms(やや暗め)
Exposure_5ms.png

露出20ms(適正)
Exposure_20ms.png

露出50ms(明るめ)
Exposure_50ms.png


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

現象 原因・対策
露出を設定しても変化しない ExposureAutoOff になっていない
設定値がエラーになる カメラ仕様に対して設定値が大きすぎ/小さすぎ
画像が暗すぎ/明るすぎ 光量不足 or ゲイン設定不足
露出が安定しない 外光の影響 or ExposureAuto が有効なまま

📝 まとめ

  • ExposureAuto = Off にすることで手動制御が可能に
  • ExposureTime は μs(マイクロ秒)単位で指定
  • pylon SDKでは Camera.Parameters[...] 経由でパラメータの設定、取得可能

🔜 次回予告

被写体の性質によっては、露出時間だけでは対応しきれない場合もあります。
次回は「ゲイン(Gain)の手動制御」について解説していきます。

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?