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

【初心者向け】産業用カメラの露光時間・フレームレート設定 完全ガイド

0
Posted at

はじめに

産業用カメラ(マシンビジョンカメラ)を初めて使うとき、露光時間フレームレートの設定は最初に直面する課題です。

民生用カメラ(スマートフォンやデジカメ)では、これらの設定は自動で最適化されますが、産業用カメラでは自分で設定する必要があります。さらに、産業用カメラには外部から同期信号で制御する方法もあり、設定パターンが多く混乱しがちです。

この記事では、以下の内容を初心者向けに解説します。

  • 露光時間・フレームレートの基本概念
  • エリアスキャンカメラとラインスキャンカメラの違い
  • グローバルシャッターとローリングシャッターの違い
  • フリーラン(内部設定)での撮影方法
  • 外部トリガーでの撮影方法
  • よくあるトラブルと対処法

設定前に確認すべきこと:「誰が」露光・タイミングを制御しているか?
露光時間やフレームレートの設定を行う際は、まずその設定がカメラ自身のパラメータなのか、外部からの制御(フレームグラバーやPLCからのトリガー信号)によるものなのかを明確にしてください。

  • カメラ内部の設定ExposureTimeAcquisitionFrameRate など、カメラのレジスタに書き込む値。フリーラン時や ExposureMode = Timed のときに有効
  • 外部制御(フレームグラバー等):トリガー信号のタイミングやパルス幅で露光やフレームレートが決まる。ExposureMode = TriggerWidth の場合、カメラ側の ExposureTime 設定は無視される

両者を混同すると、「設定値を変えたのに動作が変わらない」「フレームレートが想定通りにならない」といった問題の原因になります。本記事では、3章でカメラ内部の設定、4章で外部制御による設定をそれぞれ解説します。

タイミングチャートについて
この記事のタイミングチャートは WaveDrom で作成しています。各チャートのJSON定義も記載していますので、WaveDrom Editorに貼り付けて確認することもできます。


1. 基本概念

1.1 露光時間(Exposure Time)とは

露光時間(Exposure Time / Shutter Speed)は、カメラのセンサーが光を受け取る時間のことです。

露光時間 明るさ 動きのブレ
長い(例: 100ms) 明るくなる ブレやすい
短い(例: 1ms) 暗くなる ブレにくい

産業用カメラでは、露光時間はマイクロ秒(μs)単位で設定するのが一般的です。

露光時間を短くすると画像が暗くなります。暗くなった分を照明を強くすることで補うのが産業用途の基本です。ゲイン(電気的な増幅)で補うこともできますが、ノイズが増えるため推奨しません(詳しくは5.3 ゲイン設定と露光時間の関係を参照)。

1.2 フレームレートとスキャンレート

エリアスキャンカメラのフレームレート

フレームレート(Frame Rate)は、1秒間に撮影できるフレーム(画像)の数で、fps(frames per second)で表します。

フレームレート [fps] = 1 / フレーム周期 [秒]

例えば、フレームレート 30fps なら、1フレームの周期は約 33.3ms です。

ラインスキャンカメラのスキャンレート

ラインスキャンカメラ(ラインカメラ)では、スキャンレート(Line Rate / Scan Rate)を使い、1秒間に取得するライン数をkHzで表します。

スキャンレート [kHz] = 1 / ライン周期 [秒] × 1000

例えば、スキャンレート 50kHz なら、1ラインの周期は 20μs です。

1.3 エリアスキャンカメラとラインスキャンカメラ

産業用カメラは大きく2種類に分かれます。

エリアスキャンカメラ

  • センサーが2次元(縦×横)に配置されている
  • 1回のシャッターで2次元画像を取得
  • スマートフォンのカメラと同じ原理
  • 用途例:部品の外観検査、位置決め、ロボットビジョン

ラインスキャンカメラ

  • センサーが1次元(1列、または数列)に配置されている
  • 1回のスキャンで1ライン(1行分の画素列)を取得
  • 対象物を移動させながら連続スキャンして2次元画像を構成
  • 用途例:ウェブ検査(フィルム・紙・鋼板などの連続体)、印刷検査

sensor_comparison.png

1.4 グローバルシャッターとローリングシャッター(エリアスキャン)

エリアスキャンカメラには、2つのシャッター方式があります。

グローバルシャッター

  • 全画素が同時に露光を開始し、同時に露光を終了する
  • 動いている対象物でも歪みが発生しない
  • 産業用途ではグローバルシャッターが一般的

ローリングシャッター

  • ライン(行)ごとに順番に露光が行われる
  • 各ラインの露光開始タイミングがずれるため、動体を撮影すると歪みが発生する
  • センサーの構造がシンプルなため、高解像度・低コストなモデルに多い

01_global_shutter.png

上図のWaveDrom JSON(クリックで展開)
{
  "signal": [
    {"name": "Line 1", "wave": "0.1...0....0.1...0....", "node": ".a....b"},
    {"name": "Line 2", "wave": "0.1...0....0.1...0...."},
    {"name": "Line 3", "wave": "0.1...0....0.1...0...."},
    {"name": "   ⋮", "wave": "0...................."},
    {"name": "Line N", "wave": "0.1...0....0.1...0...."},
    {},
    {"name": "Readout", "wave": "0.....1..0.0.....1..0."},
    {"name": "FVAL", "wave": "0.....1..0.0.....1..0."}
  ],
  "edge": ["a<->b 露光時間(全ライン同時)"],
  "head": {"text": "グローバルシャッター:全画素が同時に露光"},
  "foot": {"text": "全ライン(Line 1〜Line N)の露光開始・終了タイミングが揃っている"},
  "config": {"hscale": 1}
}

02_rolling_shutter.png

上図のWaveDrom JSON(クリックで展開)
{
  "signal": [
    {"name": "Line 1", "wave": "01...0.........1...0.........", "node": "ab...c"},
    {"name": "Line 2", "wave": "0.1...0.........1...0........"},
    {"name": "Line 3", "wave": "0..1...0.........1...0......."},
    {"name": "   ⋮", "wave": "0............................"},
    {"name": "Line N", "wave": "0....1...0.........1...0....."},
    {},
    {"name": "FVAL", "wave": "0....1.....0.......1.....0..."}
  ],
  "edge": ["a<->c 露光時間(各ライン共通)", "a-b ライン間の時間差"],
  "head": {"text": "ローリングシャッター:各ラインが順次露光"},
  "foot": {"text": "各ラインの露光開始がずれるため、動体撮影時に歪みが発生する"},
  "config": {"hscale": 1}
}

グローバルシャッター vs ローリングシャッター 比較表

項目 グローバルシャッター ローリングシャッター
露光タイミング 全画素同時 ラインごとに順次
動体歪み なし あり(ローリング歪み)
一般的な用途 高速検査、ロボットビジョン 静止物撮影、高解像度用途
コスト やや高い 比較的安い

ローリングシャッターの注意点
ローリングシャッターカメラで動いている対象物を撮影すると、画像が斜めに歪む「ローリング歪み(Rolling Shutter Distortion)」が発生します。高速で動く対象物を撮影する場合は、グローバルシャッターカメラを選択してください。

1.5 カメラインターフェースの種類

産業用カメラは、PCや画像処理装置との接続に様々なインターフェースを使用します。

インターフェース 帯域幅 最大ケーブル長 特徴
CoaXPress (CXP) 6.25〜12.5 Gbps/ch (×最大4ch) 〜40m 高速・長距離。フレームグラバー必要。同軸ケーブルでトリガー信号も伝送可能
GigE Vision 1〜10 Gbps 〜100m 長距離。汎用LANケーブル使用
USB3 Vision 5 Gbps 〜5m 手軽。フレームグラバー不要
Camera Link 〜6.8 Gbps 〜10m レガシー。フレームグラバー必要

この記事では主に CoaXPress を中心に解説しますが、GenICamの設定項目はインターフェースに関わらず共通です。外部トリガーの接続方法のみ、インターフェースにより異なります。

CoaXPressの特徴

CoaXPressでは、同軸ケーブル1本で以下のすべてを伝送できます。

  • 画像データ(カメラ → フレームグラバー)
  • 制御コマンド(フレームグラバー ↔ カメラ、GenICamレジスタの読み書き)
  • トリガー信号(フレームグラバー → カメラ、CXPトリガー)

外部トリガーを使う場合、別途GPIOケーブルで接続する方法もありますが、CXPトリガー(同軸ケーブル経由)を使うのが配線がシンプルになり便利です。


2. 設定パターンの全体像

産業用カメラの露光時間とフレームレート(スキャンレート)の設定は、大きく3つのパターンに分類できます。

setting_patterns.png

初心者の方へ:まずはパターン1(フリーラン)から始めてください!
フリーランはカメラ単体で動作するため、外部機器との組み合わせによるトラブルが発生しません。まずフリーランで画像が取得できることを確認してから、必要に応じて外部トリガーに移行するのが安全です。


3. フリーラン撮影(パターン1)

フリーラン(Free Run)は、カメラが内部クロックに基づいて自律的に連続撮影するモードです。設定した露光時間とフレームレート(またはスキャンレート)で、外部信号なしに撮影を繰り返します。

3.1 エリアスキャン フリーラン

GenICam設定

AcquisitionMode       = "Continuous"    // 連続撮影モード
TriggerMode           = "Off"           // 外部トリガー無効
ExposureMode          = "Timed"         // 露光時間をカメラ内部で制御
ExposureTime          = 10000           // 露光時間 [μs](例: 10ms = 10000μs)
AcquisitionFrameRate  = 30.0            // フレームレート [fps](例: 30fps)

ExposureTime と AcquisitionFrameRate の関係に注意
フレームレートから求まるフレーム周期より、露光時間を長く設定することはできません。

ExposureTime < (1 / AcquisitionFrameRate) - ReadoutTime - Overhead

例えば 30fps の場合、フレーム周期は約 33.3ms です。読み出し時間が 5ms だとすると、露光時間の上限は約 28ms 程度になります。上限を超えた値を設定した場合、カメラによってはエラーになるか、自動的にフレームレートが下がります。

タイミングチャート:グローバルシャッター フリーラン

03_area_freerun_global.png

上図のWaveDrom JSON(クリックで展開)
{
  "signal": [
    {"name": "Internal CLK", "wave": "P...........", "period": 2},
    {},
    {"name": "Exposure", "wave": "01...0....01...0....", "node": ".a...b....cd"},
    {"name": "Readout", "wave": "0....01.0.0....01.0."},
    {"name": "Frame Valid", "wave": "0....01.0.0....01.0.", "node": ".....ef"}
  ],
  "edge": ["a<->b Exposure Time", "e<->f Readout Time", "a<->c Frame Period (= 1/FPS)"],
  "head": {"text": "エリアスキャン グローバルシャッター フリーラン"},
  "foot": {"text": "Frame Period = Exposure Time + Readout Time + Idle"},
  "config": {"hscale": 1}
}

動作の流れ:

  1. カメラ内部クロックに従い、フレーム周期ごとに撮影が開始される
  2. 全画素が同時に露光を開始
  3. 設定した露光時間だけ光を蓄積
  4. 露光終了後、**読み出し(Readout)**が行われる
  5. 読み出し完了後、画像データ(Frame Valid)がPCに転送される
  6. 1〜5を繰り返す

タイミングチャート:ローリングシャッター フリーラン

ローリングシャッターでは、各ラインが順次露光されるため、次のフレームの露光開始が現在のフレームの読み出し中に始まる(オーバーラップする)ことがあります。

04_area_freerun_rolling.png

上図のWaveDrom JSON(クリックで展開)
{
  "signal": [
    {"name": "Internal CLK", "wave": "P.............", "period": 2},
    {},
    {"name": "Line 1 Exp", "wave": "01...0.......1...0.......", "node": ".a...b.......c"},
    {"name": "Line 2 Exp", "wave": "0.1...0.......1...0......"},
    {"name": "Line N Exp", "wave": "0...1...0.......1...0...."},
    {},
    {"name": "Readout", "wave": "0...01....0.....01....0.."},
    {"name": "Frame Valid", "wave": "0...01....0.....01....0.."}
  ],
  "edge": ["a<->b Exposure Time(各ライン共通)", "a<->c Frame Period"],
  "head": {"text": "エリアスキャン ローリングシャッター フリーラン"},
  "foot": {"text": "次フレームの露光が現フレームの読み出し中に始まることがある(オーバーラップ)"},
  "config": {"hscale": 1}
}

3.2 ラインスキャン フリーラン

GenICam設定

AcquisitionMode       = "Continuous"    // 連続撮影モード
TriggerMode           = "Off"           // 外部トリガー無効(フリーラン)
ExposureMode          = "Timed"         // 露光時間をカメラ内部で制御
ExposureTime          = 20              // 露光時間 [μs](例: 20μs)
AcquisitionLineRate   = 50000.0         // スキャンレート [Hz](例: 50kHz)

ラインスキャンのフリーラン時の注意
ラインスキャンのフリーランは、対象物の移動速度と同期していないため、実際のライン検査ではほとんど使いません。主にカメラの動作確認照明の調整の目的で使用します。実際のライン検査では、エンコーダ同期(4.5節参照)を使用します。

タイミングチャート:ラインスキャン フリーラン

05_line_freerun.png

上図のWaveDrom JSON(クリックで展開)
{
  "signal": [
    {"name": "Internal CLK", "wave": "P.........", "period": 2},
    {},
    {"name": "Line Exposure", "wave": "01.0.01.0.01.0.01.0.", "node": ".a.b..c"},
    {"name": "Line Readout", "wave": "0..1.0..1.0..1.0..1."},
    {"name": "Line Valid", "wave": "0..1.0..1.0..1.0..1.", "node": "..d.e"}
  ],
  "edge": ["a<->b Exposure Time", "a<->c Line Period (= 1/Line Rate)", "d<->e Readout Time"],
  "head": {"text": "ラインスキャン フリーラン"},
  "foot": {"text": "Line Period = Exposure Time + Readout Time + Overhead"},
  "config": {"hscale": 1.5}
}

動作の流れ:

  1. 内部クロックに従い、ライン周期ごとにスキャンが開始される
  2. 1ライン分の画素が露光
  3. 露光終了後、1ライン分のデータが読み出される
  4. 1〜3を繰り返す
ライン周期 = 1 / スキャンレート
ExposureTime < ライン周期 - ラインオーバーヘッド

4. 外部トリガー撮影(パターン2・パターン3)

外部トリガー撮影は、カメラの外部から入力される信号に同期して撮影を行う方式です。検査対象物の到来タイミングに合わせた撮影や、複数カメラの同期撮影に使用します。

4.1 トリガーモードの概要

モード 撮影タイミング 露光時間の決め方 用途
フリーラン カメラ内部クロック カメラ内部設定 動作確認、連続モニタリング
ソフトウェアトリガー PCからのコマンド カメラ内部設定 低速検査、デバッグ
ハードウェアトリガー(Timed) 外部電気信号 カメラ内部設定 一般的な外部同期検査
ハードウェアトリガー(TriggerWidth) 外部電気信号 トリガー信号のパルス幅 露光時間も外部制御したい場合

ソフトウェアトリガーはPCからGenICamコマンド(TriggerSoftware)で1フレームずつ撮影を指示します。通信の遅延があるため、高速な同期撮影には向きませんが、デバッグ時には便利です。

4.2 ハードウェアトリガー:エッジトリガー(ExposureMode = Timed)

最も一般的な外部トリガー方式です。外部信号の立ち上がりエッジ(または立ち下がりエッジ)を検出して撮影を開始します。露光時間はカメラ内部のExposureTime設定値が使われます。

GenICam設定

// --- トリガー設定 ---
TriggerSelector       = "FrameStart"       // フレーム開始トリガー
TriggerMode           = "On"               // トリガーモード有効
TriggerSource         = "Line0"            // 入力ソース(GPIO Line0)
                      // または "CXPTrigger0"  // CoaXPressの場合、CXPトリガーも選択可能
TriggerActivation     = "RisingEdge"       // 立ち上がりエッジで撮影開始

// --- 露光設定 ---
ExposureMode          = "Timed"            // 露光時間はカメラ内部設定
ExposureTime          = 5000               // 露光時間 [μs](例: 5ms)

タイミングチャート:エッジトリガー

06_edge_trigger.png

上図のWaveDrom JSON(クリックで展開)
{
  "signal": [
    {"name": "Trigger In", "wave": "010......010......010......", "node": ".a........b"},
    {},
    {"name": "Exposure", "wave": "0.1...0..0.1...0..0.1...0.", "node": "..c...d"},
    {"name": "Readout", "wave": "0.....1.00.....1.00.....1.0"},
    {"name": "Frame Valid", "wave": "0.....1.00.....1.00.....1.0"}
  ],
  "edge": ["a~>c トリガー検出", "c<->d Exposure Time(カメラ内部設定)", "a<->b トリガー間隔"],
  "head": {"text": "エッジトリガー(ExposureMode = Timed)"},
  "foot": {"text": "トリガーの立ち上がりエッジで露光開始、露光時間はカメラ設定値"},
  "config": {"hscale": 1}
}

動作の流れ:

  1. 外部トリガー信号の立ち上がりエッジをカメラが検出
  2. カメラ内部で設定された ExposureTime の時間だけ露光
  3. 露光終了後、読み出し(Readout)
  4. 画像データ転送(Frame Valid)
  5. 次のトリガーエッジを待機

4.3 ハードウェアトリガー:トリガー幅制御(ExposureMode = TriggerWidth)

トリガー信号のパルス幅(HIGHの期間)がそのまま露光時間になります。露光時間を外部から動的に変更したい場合に使用します。

GenICam設定

// --- トリガー設定 ---
TriggerSelector       = "FrameStart"
TriggerMode           = "On"
TriggerSource         = "Line0"
TriggerActivation     = "RisingEdge"       // 立ち上がりで露光開始

// --- 露光設定 ---
ExposureMode          = "TriggerWidth"     // トリガー幅 = 露光時間

ExposureMode = TriggerWidth の場合、ExposureTime の設定値は無視されます。露光時間はトリガー信号のパルス幅で決まります。

タイミングチャート:トリガー幅制御

07_trigger_width.png

上図のWaveDrom JSON(クリックで展開)
{
  "signal": [
    {"name": "Trigger In", "wave": "01...0...01.0..01....0..", "node": ".a...b...c.d...e....f.."},
    {},
    {"name": "Exposure", "wave": "01...0...01.0..01....0.."},
    {"name": "Readout", "wave": "0....1.0.0.1.00.....1.0"},
    {"name": "Frame Valid", "wave": "0....1.0.0.1.00.....1.0"}
  ],
  "edge": ["a<->b パルス幅 = 露光時間(長い)", "c<->d パルス幅 = 露光時間(短い)", "e<->f パルス幅 = 露光時間(さらに長い)"],
  "head": {"text": "トリガー幅制御(ExposureMode = TriggerWidth)"},
  "foot": {"text": "トリガー信号のHIGH期間 = 露光時間。パルス幅を変えると露光時間も変わる"},
  "config": {"hscale": 1}
}

4.4 トリガーディレイ

トリガーディレイ(Trigger Delay)は、トリガー信号を受けてから実際に露光を開始するまでの遅延時間を設定する機能です。

GenICam設定

TriggerDelay          = 100                // トリガーディレイ [μs](例: 100μs)

タイミングチャート:トリガーディレイ

08_trigger_delay.png

上図のWaveDrom JSON(クリックで展開)
{
  "signal": [
    {"name": "Trigger In", "wave": "010..........010..........", "node": ".a............b"},
    {},
    {"name": "Delay", "wave": "0=0..........0=0..........", "data": ["Delay", "Delay"], "node": "..c............d"},
    {},
    {"name": "Exposure", "wave": "0.01...0.....0.01...0.....", "node": "..ef...g"},
    {"name": "Readout", "wave": "0......01.0..0......01.0.."},
    {"name": "Frame Valid", "wave": "0......01.0..0......01.0.."}
  ],
  "edge": ["a~>e トリガー → ディレイ → 露光開始", "a<->e TriggerDelay", "e<->g Exposure Time"],
  "head": {"text": "トリガーディレイ"},
  "foot": {"text": "トリガー検出後、設定したディレイ時間だけ待ってから露光を開始"},
  "config": {"hscale": 1}
}

用途例:

  • センサーが対象物を検出してからカメラの視野に入るまでの時間を補正
  • 複数カメラで意図的に撮影タイミングをずらしたい場合

4.5 ラインスキャンの外部同期(エンコーダ同期)

ラインスキャンカメラの実運用では、対象物の移動速度に同期してライン撮影を行うエンコーダ同期が一般的です。

搬送系に取り付けたロータリーエンコーダのパルスをトリガーとして使用し、対象物が一定距離移動するたびに1ラインを撮影します。

GenICam設定

// --- トリガー設定 ---
TriggerSelector       = "LineStart"        // ライン開始トリガー
TriggerMode           = "On"
TriggerSource         = "Line0"            // エンコーダ信号入力
                      // または "CXPTrigger0"
TriggerActivation     = "RisingEdge"

// --- 露光設定 ---
ExposureMode          = "Timed"
ExposureTime          = 15                 // 露光時間 [μs](例: 15μs)

タイミングチャート:エンコーダ同期

09_line_encoder.png

上図のWaveDrom JSON(クリックで展開)
{
  "signal": [
    {"name": "Encoder Pulse", "wave": "010.010.010.010.010.010.", "node": ".a...b"},
    {"name": "(搬送移動)", "wave": "=.=.=.=.=.=.=.=.=.=.=.=.", "data": ["→","→","→","→","→","→","→","→","→","→","→","→"]},
    {},
    {"name": "Line Exposure", "wave": "0.1.00.1.00.1.00.1.00.1."},
    {"name": "Line Readout", "wave": "0..100..100..100..100..10"},
    {"name": "Line Valid", "wave": "0..100..100..100..100..10"}
  ],
  "edge": ["a<->b エンコーダパルス間隔 (= 移動距離に比例)"],
  "head": {"text": "ラインスキャン エンコーダ同期"},
  "foot": {"text": "エンコーダのパルスごとに1ライン撮影。搬送速度に同期した等間隔スキャンを実現"},
  "config": {"hscale": 1.5}
}

エンコーダの分解能とスキャンレートの関係
搬送速度が速い場合や、エンコーダの分解能が高い場合、エンコーダパルスの周波数がカメラの最大スキャンレートを超えることがあります。この場合、カメラが一部のパルスを取りこぼし、画像に抜けラインが発生します(5.1節参照)。

CoaXPressでのエンコーダ同期

CoaXPressシステムでは、以下の2通りの接続方法があります。

cxp_encoder_connection.png

方法1では、フレームグラバー側でエンコーダ信号の分周・逓倍が可能なため、エンコーダの分解能とカメラのスキャンレートの調整が柔軟にできます。


5. トラブルシューティング

外部トリガーを使用する場合、設定の組み合わせによって様々なトラブルが発生します。ここでは、よくある問題と対処法を解説します。

5.1 同期信号がカメラの処理能力を超えている

症状

  • 想定したフレームレート(スキャンレート)が出ない
  • フレームが間引かれる・欠落する
  • トリガー入力回数と取得フレーム数が合わない

原因

外部トリガーの周波数が、カメラの**最大フレームレート(最大スキャンレート)**を超えている場合に発生します。

カメラは1フレーム(1ライン)の処理中に次のトリガーを受け付けることができません。処理が完了する前に次のトリガーが来ると、そのトリガーは無視されます。

カメラの最大フレームレート: 100fps → 最小フレーム周期: 10ms
外部トリガー周波数:         120fps → トリガー間隔:     8.3ms

→ カメラの処理能力を超えているため、一部のトリガーが無視される

タイミングチャート:トリガーが速すぎるケース

10_trouble_fast_trigger.png

上図のWaveDrom JSON(クリックで展開)
{
  "signal": [
    {"name": "Trigger In", "wave": "010.010.010.010.010.010.", "node": ".a...b...c"},
    {},
    {"name": "Exposure", "wave": "0.1..0......1..0......1."},
    {"name": "Readout", "wave": "0....1..0......1..0....."},
    {"name": "Frame Valid", "wave": "0....1..0......1..0....."},
    {},
    {"name": "Camera Busy", "wave": "0.1.....0...1.....0...1."},
    {"name": "Trigger Miss", "wave": "0...x0..x0..0...x0..x0..", "data": ["MISS","MISS","MISS","MISS"]}
  ],
  "edge": ["a<->b トリガー間隔", "b~>c この間のトリガーは無視される(Camera Busy中)"],
  "head": {"text": "【トラブル】トリガーが速すぎるケース"},
  "foot": {"text": "カメラがBusy(露光+読出し中)のトリガーは無視される → フレーム欠落"},
  "config": {"hscale": 1}
}

対処法

  1. 外部トリガーの周波数を下げる(カメラの最大フレームレート以下にする)
  2. 露光時間を短くする(フレーム周期を短縮できる場合がある)
  3. ROI(Region of Interest)を小さくする(読み出し時間が短くなり、最大フレームレートが上がる)
  4. より高速なカメラに変更する

最大フレームレートの確認方法
GenICamでは AcquisitionFrameRate の最大値を取得することで確認できます。ただし、この値は現在のROI設定や画素フォーマットによって変化します。

5.2 露光時間がトリガー間隔より長い

症状

  • フレームが欠落する
  • 想定したフレームレートが出ない
  • 5.1と同様の症状だが、最大フレームレート以下のトリガー周波数でも発生する

原因

ExposureMode = Timed で設定した露光時間が長すぎる場合、カメラの1フレームの処理時間(露光 + 読み出し)がトリガー間隔を超えてしまいます。

設定した露光時間:      20ms
読み出し時間:          5ms
→ 1フレームの処理時間: 25ms

外部トリガー間隔:      15ms

→ 処理時間(25ms) > トリガー間隔(15ms) のため、トリガーを取りこぼす

タイミングチャート:露光時間が長すぎるケース

11_trouble_long_exposure.png

上図のWaveDrom JSON → wavedrom/11_trouble_long_exposure.json

対処法

  1. 露光時間を短くする
必要条件: ExposureTime + ReadoutTime + Overhead < トリガー間隔
  1. 照明を強くして露光時間を短縮する(最も効果的な対処法)
  2. トリガー間隔を長くする(フレームレートを下げる)
  3. TriggerWidth モードに切り替える(トリガー信号のパルス幅で露光時間を制御し、確実にトリガー間隔内に収める)

5.3 ゲイン設定と露光時間の関係

ゲインとは

ゲイン(Gain)は、センサーが受け取った光の信号を電気的に増幅する設定です。単位は dB です。

GenICam設定:
Gain = 0.0    // ゲイン0dB(増幅なし)
Gain = 6.0    // ゲイン6dB(約2倍に増幅)
Gain = 12.0   // ゲイン12dB(約4倍に増幅)

ゲインを上げすぎると起きる問題

ゲイン値 明るさ ノイズ 画質
低い(0〜3dB) 暗い 少ない 良い
中程度(6〜12dB) 中間 やや多い 許容範囲
高い(18dB〜) 明るい 非常に多い 悪い

鉄則:まず照明を強くする、次に露光時間を延ばす、最後にゲインを上げる

画像が暗い場合の対処の優先順位:

  1. 照明を強くする(画質劣化なし、最優先)
  2. 露光時間を延ばす(ブレに注意、フレームレートに制約)
  3. ゲインを上げる(最終手段、ノイズ増加を許容する場合のみ)

GenICam設定の注意

// 露光時間とゲインの設定例
ExposureTime = 5000    // 5ms
Gain         = 0.0     // まずゲイン0dBで試す

// 暗い場合 → まず照明を見直す or 露光時間を延ばす
ExposureTime = 10000   // 10msに変更

// それでも暗い場合 → 最終手段としてゲインを少し上げる
Gain         = 6.0     // 6dBに変更(約2倍に増幅)

5.4 白飛び・黒つぶれ

白飛び(Saturation / Overexposure)

画像の一部または全体が真っ白になる現象です。センサーが受け取る光量が多すぎて、画素値が最大値(8bitなら255)に張り付いてしまいます。

原因:

  • 露光時間が長すぎる
  • 照明が強すぎる
  • ゲインが高すぎる

対処法:

  1. 露光時間を短くする
  2. 照明の光量を下げる
  3. ゲインを下げる
  4. NDフィルター(減光フィルター)を使用する

黒つぶれ(Underexposure)

画像の一部または全体が真っ黒になる現象です。センサーが受け取る光量が少なすぎて、画素値が0に張り付いてしまいます。

原因:

  • 露光時間が短すぎる
  • 照明が弱すぎる or 照明が点灯していない
  • レンズの絞りが閉じすぎている

対処法:

  1. 照明を強くする(最優先)
  2. 露光時間を長くする
  3. レンズの絞りを開く
  4. (最終手段)ゲインを上げる

適正露光の確認方法

多くのカメラビューアにはヒストグラム表示機能があります。ヒストグラムを確認し、画素値が0や255に集中していないことを確認してください。

histogram_comparison.png


6. 設定フロー(まとめ)

以下のフローに従って設定を進めると、トラブルを避けやすくなります。

flowchart.png


7. GenICam 主要フィーチャー一覧

この記事で登場した GenICam SFNC(Standard Features Naming Convention)のフィーチャーを一覧にまとめます。

カテゴリ フィーチャー名 説明
撮影制御 AcquisitionMode Enum 撮影モード(Continuous / SingleFrame / MultiFrame)
撮影制御 AcquisitionFrameRate Float フレームレート [fps](エリアスキャン)
撮影制御 AcquisitionLineRate Float スキャンレート [Hz](ラインスキャン)
トリガー TriggerSelector Enum トリガー対象の選択(FrameStart / LineStart)
トリガー TriggerMode Enum トリガーの有効/無効(On / Off)
トリガー TriggerSource Enum トリガー入力源(Line0, CXPTrigger0, Software 等)
トリガー TriggerActivation Enum トリガー検出方式(RisingEdge / FallingEdge / LevelHigh / LevelLow)
トリガー TriggerDelay Float トリガーディレイ [μs]
トリガー TriggerSoftware Command ソフトウェアトリガー実行コマンド
露光 ExposureMode Enum 露光制御方式(Timed / TriggerWidth)
露光 ExposureTime Float 露光時間 [μs]
ゲイン Gain Float アナログ/デジタルゲイン [dB]

フィーチャー名はGenICam SFNC(Standard Features Naming Convention)に基づいています。カメラメーカーによっては独自のフィーチャー名を使用している場合もあります。詳しくは各カメラメーカーのドキュメントを参照してください。


参考リンク

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