対象物が構成する輪郭の幾何情報を特徴量として利用したパターンマッチング手法です。マスターパタンの特徴量と、マッチング対象画像の特徴量との対応を一致度の評価値として用いることで類似度を求めています。 マッチングは二段階で行っており、始めにパラメータ空間への投票を用いた多数決方式によって候補を絞り、さらに周辺対応点探索を行って大体の位置を決定します。 その後、第一段階の処理で残った候補の位置で再度対応点探索を行い、高精度に推定を行うことで最終的な位置、姿勢、スケール値を算出します。 機能面では従来の弊社のパターンマッチング技術である高機能サーチ同様、平行移動、回転、スケール変化を扱うことが可能で、一部の特徴量に欠損があっても変換パラメータ(平行移動、回転、スケール変化)の推定結果に影響を与えません。
以下に、FPMの特徴を挙げます。
- 長所
- 平行移動、回転、スケール変化を扱うことができる
- 対象物の一部が視野外にあっても探索が可能
- 対象物のコントラストが低い場合のノイズの影響を低減
- 汚れの付着による欠損の影響を受けない
- シェーディングの影響を受けにくい
- 画像の輝度変化に強い
- 焦点ずれ等のボケによる精度の低下を抑制
- 特定形状以外でも安定した探索を実現
- 処理時間変動の抑制
- 短所
- 太り細りの影響を受ける(非相似変形に未対応)
- 処理時間の増大
- パラメータ設定が難解である
FPMは「FPMオブジェクトの生成」と、「マッチング実行」の2つの関数のみで実現可能です。FPMオブジェクトとは、マッチングを行うマスターパタン毎に必要となるオブジェクトです。
FPMの簡単な実行
FPMオブジェクトではマスターパタンの画像はもちろん、マスクやパラメータ等の入力情報からマッチング結果まで、様々なデータを管理しております。 マッチング実行関数である fnFIE_fpm_matching() に関しては下図のようにパーツレベルで用意されたライブラリによって構成されていますので、特徴量計測等のライブラリを個別に実行することも可能です。
FPMマッチング実行( fnFIE_fpm_matching() )内部での処理
FPMではマッチングのモードとして、画像を1/4(面積比)に圧縮してマッチングを行う高速モードが選択可能です。 通常版と比較して約2〜3倍の処理速度でマッチング可能で、検出能力、認識能力に関してもほぼ遜色ありません。精度については繰り返し精度には大きな低下は確認されていませんが、絶対位置精度では通常モードと比べて約半分程度の精度低下が確認されています。
- 注意:
- 尚、高速モードでは通常モードとの仕様上の違いがありますのでご注意ください。
スケール変化には完全に対応するわけでなく、パラメータのスケール最小値と最大値が違うことをチェックして約±5%程度対応します。
FPMで必要となるパラメータの説明をします。安定してマッチングを行うためにはパラメータの調整が必要です。
- 特徴量抽出パラメータ( 共用体 F_FPM_FEATURE )
- FPMではエッジ情報を細線化後、サブピクセル精度で求めた情報をマッチングに使用するための特徴量としています。この特徴量を抽出するためのパラメータです。
- 特徴量計測方法 特徴量抽出に使用するアルゴリズムを次の5つの方法から選択可能です。
- ソーベルエッジ
- 直感的にわかりやすいパラメータで、高速に処理(エッジ抽出時間のみ)が可能ですが、環境変化に弱く、対象物の焦点ずれ等によるボケが生じた場合に精度の安定性が低い傾向があります。
- 相関エッジ
- ノイズやボケ、シェーディングなどの悪条件に比較的強い傾向がありますが、ソーベルエッジより処理時間が掛かり、パラメータ調整にも熟練が必要です。
- 強度上限付ソーベルエッジ
- 強いコントラストを持つ背景の近傍に弱いコントラストを持つ対象物がある時、背景を無視してマッチングする目的でソーベルエッジの強度しきい値に上限を設けたアルゴリズムです。
- 強度上限付相関エッジ
- 強いコントラストを持つ背景の近傍に弱いコントラストを持つ対象物がある時、背景を無視してマッチングする目的で相関エッジの分散しきい値と強度しきい値に上限を設けたアルゴリズムです。
- 細線エッジ
- 1画素から5画素程度の幅を持つような極めて細い線で構成され内外が同一の輝度であるような対象物に使用し、線の中央を特徴点として検出します。マッチングパラメータに必ず両極性を指定せねばならないため処理時間がかかりますが、ソーベルエッジや相関エッジのように濃度の変化する点を検出するアルゴリズムでは対応の難しい場合に対応できます。ただし性質上、パターンの10度以上の回転に弱い他、高速モードの場合コントラストしきい値を通常モードより低めにしたり誤差範囲を広めにとらないとサーチが成功しないなどの特徴も持っています。
- 強度上限付相関エッジでのみ有効なパラメータ( F_FPM_FEATURE::corr_max_edge )
- 相関エッジフィルタの長さ( F_EDGE_CORR_MAX_PARAMS::width, 推奨値:13 )
- 相関エッジに使用する領域の長さ方向の値を画素で指定します。
- 設定範囲:3≦フィルタ長さ≦255の奇数, フィルタ高さ≦フィルタ長さ
- 相関エッジフィルタの高さ( F_EDGE_CORR_MAX_PARAMS::height, 推奨値:5 )
- 相関エッジに使用する領域の幅方向の値を画素で指定します。
- 設定範囲:1≦フィルタ高さ≦255 の奇数, フィルタ高さ≦フィルタ長さ
- シグモイド係数( F_EDGE_CORR_MAX_PARAMS::sigmoid_k, 推奨値:1.0 )
- 相関エッジに使用するためのマスターとなるシグモイド関数の形状を決める係数です。
- 設定範囲:0<シグモイド係数
- 分散下限しきい値( F_EDGE_CORR_MAX_PARAMS::var_threshold_min, 推奨値:25 )
- 相関エッジで使用する領域内の濃度分散値の下限値を決定します。領域内の濃度分散値が設定値を超えた場合にエッジであるとみなします。
- 設定範囲:0<分散しきい値≦16384
- 分散上限しきい値( F_EDGE_CORR_MAX_PARAMS::var_threshold_max, 推奨値:16384 )
- 相関エッジで使用する領域内の濃度分散値の上限値を決定します。領域内の濃度分散値が設定値を超えない場合にエッジであるとみなします。
- 設定範囲:0<分散しきい値≦16384
- 強度下限しきい値( F_EDGE_CORR_MAX_PARAMS::mag_threshold_min, 推奨値:160 )
- 相関エッジで使用するエッジ強度の下限値を決定します。相関エッジによって得られたエッジ強度(=モデルエッジとの類似度)が設定値を超えた場合にエッジであるとみなします
- 設定範囲:0≦強度しきい値≦255
- 強度上限しきい値( F_EDGE_CORR_MAX_PARAMS::mag_threshold_max, 推奨値:255 )
- 相関エッジで使用するエッジ強度の上限値を決定します。相関エッジによって得られたエッジ強度(=モデルエッジとの類似度)が設定値を超えない場合にエッジであるとみなします
- 設定範囲:0≦強度しきい値≦255
- 非極大抑制のフィルタ片幅( F_EDGE_CORR_MAX_PARAMS::nms_length, 推奨値:6(=相関エッジフィルタの長さ/2) )
- 細線化処理を行う際の幅を画素値で設定します。
- 設定範囲:1≦フィルタ片幅
- 通常の相関エッジフィルタと共通するパラメータの詳細や決定方法については、 F_EDGE_CORR_PARAMS 構造体を参照してください。
- 細線エッジでのみ有効なパラメータ( F_FPM_FEATURE::groove_edge )
- 分布係数( F_EDGE_GROOVE_PARAMS::sigma, 推奨値 : 1.0 )
- フィルタの形状を決める係数です。検出したい細線幅の4分の1から2分の1を目安に指定します。
- 設定範囲:0<分布係数
- フィルタの長さ( F_EDGE_GROOVE_PARAMS::width, 推奨値 : 13 )
- フィルタに使用する領域の長さ方向の値を画素で指定します。
- 細線とその両側に広がる輝度一定領域の長さ合計より小さい値に指定します。
- 分布係数の4倍以上を推奨します。
- 設定範囲: 3≦フィルタ長さ≦255 の奇数, フィルタ高さ≦フィルタ長さ
- フィルタの高さ( F_EDGE_GROOVE_PARAMS::height, 推奨値 : 5 )
- フィルタに使用する領域の幅方向の値を画素で指定します。
- フィルタ長さの半分程度が目安になります。
- 設定範囲: 1 ≦フィルタ高さ≦255 の奇数, フィルタ高さ≦フィルタ長さ
- コントラスト下限しきい値( F_EDGE_GROOVE_PARAMS::con_threshold_min, 推奨値:0.1)
- フィルタ領域内のコントラストが設定値を超えた場合にエッジであるとみなします。
- 設定範囲:0≦コントラスト下限しきい値<コントラスト上限しきい値≦1.0
- コントラスト上限しきい値( F_EDGE_GROOVE_PARAMS::con_threshold_max, 推奨値:1.0)
- フィルタ領域内のコントラストが設定値を超えない場合にエッジであるとみなします。
- 設定範囲:0≦コントラスト下限しきい値<コントラスト上限しきい値≦1.0
- 強度下限しきい値( F_EDGE_GROOVE_PARAMS::mag_threshold_min, 推奨値:0.5 )
- エッジ強度(=モデルエッジとの類似度)が設定値を超えた場合にエッジであるとみなします
- 一般的なエッジの強度とは考え方が違い、マスターとなるエッジモデルとの類似度を強度としています。
- 設定範囲:0≦強度下限しきい値<強度上限しきい値≦1.0
- 強度上限しきい値( F_EDGE_GROOVE_PARAMS::mag_threshold_max, 推奨値:1.0 )
- エッジ強度(=モデルエッジとの類似度)が設定値を超えない場合にエッジであるとみなします
- 一般的なエッジの強度とは考え方が違い、マスターとなるエッジモデルとの類似度を強度としています。
- 設定範囲:0≦強度下限しきい値<強度上限しきい値≦1.0
- 非極大抑制のフィルタ片幅( F_EDGE_GROOVE_PARAMS::nms_length, 推奨値:6(=フィルタの長さ/2) )
- 細線化処理を行う際の幅を画素値で設定します。正しいエッジ位置の近隣に余計なエッジが生じる場合には値を大きくします。
- 設定範囲:1≦フィルタ片幅(フィルタ長さの半分)
- 線色 ( F_EDGE_GROOVE_PARAMS::color )
- 検出する線の色を指定します。
- 設定範囲:BLACK_COLOR, WHITE_COLOR, BLACK_WHITE_COLOR のいずれか。
- 白い背景に黒い線の場合 BLACK_COLOR を、黒い背景に白い線の場合 WHITE_COLORを指定してください。 BLACK_WHITE_COLOR は両方検出したい場合に指定します。
- マッチングパラメータ
- F_FPM_MATCH 構造体に指定するパラメータで、マッチングを行う際のパラメータです。
エッジの極性を考慮した場合のマッチング結果の差
- 領域スコア再計算パラメータ
- F_FPM_AREASCORE 構造体に指定するパラメータです。 エッジのマッチング処理では、マスターパタンのエッジの対応がつくか否かでスコアが決定します。 よって、マスターパタンのエッジとは対応しない位置に余分なエッジが存在するような状況でも、スコアに対する考慮はされません。 領域スコア再計算を行うと、このようなノイズや隠蔽によって余計なエッジが生じる状況で減点処理を行いスコアに差をつけることが可能です。
領域スコア計算によるスコアの変化
- 覚え書き:
- FIE版のFPMではパタン登録時にはボーダー処理(fnFIE_copy_border()の F_BORDER_CONTINUOUS)を行って処理しています。一方で、画像オブジェクトを入力としたマッチング処理ではボーダー処理を行っていません。 ボーダー処理を行った画像に対してマッチングをしたい場合には、特徴量抽出処理を行った後、特徴量オブジェクトを用いたマッチングを行う必要があります。
- 対応する画像タイプは8bit濃淡画像のみとなります。
- うまくみつからないときは
- 特徴量抽出パラメータの調整をして、対象物の輪郭が正確に取得できているか、エッジの状態を確認しましょう。(fnFIE_fpm_get_pattern_feature_edges(),fnFIE_fpm_get_matching_feature_edges()にてマッチングに使用する特徴量を取得できます)
- 細いパタン
- 相関エッジを使用している場合には、フィルタ長さを小さくします。
- ぼやけた画像
- 相関エッジを使用している場合には、シグモイド係数, 分散しきい値の値を小さくし、フィルタ長さを大きくします。
- ソーベルエッジを使用している場合には、エッジ強度しきい値を小さくします。
- コントラストが低い
- 相関エッジを使用している場合には、分散しきい値を小さくします。
- ソーベルエッジを使用している場合には、エッジ強度しきい値を小さくします。
- マッチングパラメータのスコアしきい値を下げてみましょう。
- マッチングウインドウ指定が適切か確認しましょう。
- マスクの設定が適切かどうか検討しましょう。
- マッチング結果取得個数が適切か調べましょう。
- なるべく探したい対象物の輪郭がはっきりし、且つマッチングにとって不必要な情報が少なくなるような画像を取得できる環境の構築を心がけましょう。
- マッチングが遅いときは
- マッチングに使用しているエッジ情報を確認して、特徴量が過剰に取得されていないか確認しましょう
- パターン画像が不必要に大きくないか検討しましょう。
- 高速モード(F_FPM_SPEED_MODE)を試してみましょう。
- エッジ抽出方法としてソーベルフィルタが適用可能かを検討しましょう。
- マッチングウインドウを小さくしてみましょう。
- スコアしきい値の値を大きくしてましょう。
- 複数のパタンをマッチングする場合、特徴量取得とマッチングを分けて実行することを試みましょう。
- 使用例
- サンプル