PRCResampleMethod

定義

#include <nitro/prc.h>

typedef enum PRCResampleMethod
{
    PRC_RESAMPLE_METHOD_NONE = 0,
    PRC_RESAMPLE_METHOD_DISTANCE,
    PRC_RESAMPLE_METHOD_ANGLE,
    PRC_RESAMPLE_METHOD_RECURSIVE,
} PRCResampleMethod;

要素

PRC_RESAMPLE_METHOD_NONE リサンプルしない
PRC_RESAMPLE_METHOD_DISTANCE シティブロック距離が threshold を超えたら次の点を採用
PRC_RESAMPLE_METHOD_ANGLE 角度が直前に採用した辺より threshold 以上離れていたら次の点を採用(角度は2π/65536ラジアン単位)
PRC_RESAMPLE_METHOD_RECURSIVE 再帰的処理により、リサンプル前の全ての点がリサンプル後の各辺より threshold 以下しか離れていないようになる点を採用

説明

PRC_InitInputPatternEx() の引数の PRCInputPatternParam に含まれる列挙型です。

生の入力点列はそのまま用いると点の数が多すぎ、また手の震えによるノイズも多く乗っているため、特徴的な点だけを残すリサンプリング処理が必要となります。この列挙型はリサンプリングに用いるアルゴリズムを指定するためのものです。

PRC_RESAMPLE_METHOD_NONE
リサンプルせず、連続する同一座標値の除去のみを行います。
リサンプル処理はもっとも高速ですが、リサンプルによる処理対象の点数の削減が行われませんので、総合的には処理が重くなることがほとんどです。
PRC_RESAMPLE_METHOD_DISTANCE
各画の始点をまず採用し、その後、移動距離の合計が threshold を超えた時点で次の点を採用します。各画の終点も必ず採用します。なお、距離値には通常のユークリッド距離ではなく、シティブロック距離(x座標の差とy座標の差の和)が用いられます。
処理は高速ですが、あまりよい特徴点抽出ができない傾向にあります。
PRC_RESAMPLE_METHOD_ANGLE
各画の始点をまず採用し、書き出しの方向を『直前の方向』として記憶します。その後、画内の線分を順に辿っていき、『直前の方向』との角度の差が threshold 以上になったときにその線分の始点を採用し、その線分の方向を直前の方向として記憶する、ということを繰り返します。各画の終点も必ず採用します。
角度の算出に各入力点に対して FX_Atan2Idx() を用います。そのため、threshold には1周をu16の範囲で表したときの値を用います(例:直角=16384)。処理速度は中程度です。
PRC_RESAMPLE_METHOD_RECURSIVE
各画の始点と終点をまず採用し、それぞれ、点Aと点Bと置きます。点Aと点Bの間の全ての点について、点Aと点Bとを結ぶ直線との距離を求め、距離が最大になる点Cを求めます。その距離が threshold 以上であれば採用し、未満であれば点の選択を止めます。点Cを採用した場合は、点Aと点C、点Cと点Bを2組の新しい点Aと点Bとして、以上の処理を再帰的に繰り返します。
線分と点の距離の計算は各点について積算数回で済みますが、最悪の場合にはその距離の計算が各画につき画を構成する点の数の二乗のオーダーで発生するため、非常に遅くなる可能性があります。しかし、通常は画を構成する点数の数倍程度で終了し、またリサンプリングの結果もほかのアルゴリズムに比べると少ない点で特徴をよくとらえたものが得られます。

リサンプルアルゴリズムの詳細は、docs/TechnicalNotes/AboutPatternRecognition.pdf を参照してください。

参照

PRCInputPatternParam, PRC_InitInputPattern*, PRC_ResampleStrokes*

履歴

2005/02/18 解説ドキュメントのファイル名を修正
2004/06/23 初版