18 特徴マッチングとカラーマッチング
前2章のマッチング手法には共通点がある:それらはいずれも稠密であるということだ。グレースケールマッチング(チャプター 16)はテンプレート全体を1画素ずつ比較し、形状マッチング(チャプター 17)は輪郭全体を1点ずつ比較する。姿勢(角度、スケール)は明示的な次元として段階的に探索しなければならず、探索範囲が広がるほど計算コストが増大する。本章では、これとは異なるアプローチを採る2種類のマッチングを紹介する。特徴マッチング(feature matching)は画像を数十個のキーポイント(keypoint)に圧縮し、比較対象を画素の塊ではなく疎な点集合とする。部品が任意の角度、さらには異なるスケールで出現する可能性がある場合、そのコストは姿勢範囲にほとんど依存しない。カラーマッチング(color matching)は幾何情報を完全に放棄する。「これは赤いキャップか黄いキャップか」という選別問題では、部品の位置や回転角度よりも何色であるかが重要であり、色情報の統計量を用いた分類は、どの幾何マッチングよりも直接的である。
特徴マッチングの部分では、実際の工業用サンプル画像を用いる。Smart3の「特徴マッチング」位置決めレシピのサンプルである5アームローター/スプロケット鋳物を、暗視野照明下で\(1000\times 800\)の8ビットグレースケール画像として撮影したものだ。同一の物理的な部品が4枚の画像内で異なる位置と角度で出現しており、これはまさに特徴マッチングが最も威力を発揮する場面である。そのうちの1枚(rotor_001、部品が中央やや上部にある)から部品サイズの正方形を切り出してテンプレートとし(図 18.1 (a))、残りの3枚(rotor_002/003/004)でそれを探索する。部品の表面は鋳造のサンドブラスト加工のテクスチャで覆われ、貫通穴、溝、アーム先端が点在しているため、コーナーが非常に多い。しかし同時にほぼ5回回転対称でもあり、これがマッチングにとって現実的な落とし穴となっている。詳細は後述する。カラーマッチングの部分は合成データのままとする。この「特徴マッチング」サンプルセットはシングルチャンネルのグレースケールであり、カラーマッチングを実行できない。SciSvColorMatchの使用法と色度の振る舞いを完全に示すため、カラー実験では赤/緑/青/黄のボトルキャップ選別の合成シーンを用いる。これについては セクション 18.4 で説明する。
rotor_001内の部品の輝度重心を中心に切り出した\(480\times 480\)の正方形。サンドブラストテクスチャ、貫通穴、溝、5つのアーム先端により数百のコーナーが得られる。(b) \(1000\times 800\)の探索画像:同一部品が暗視野上で異なる位置と回転で出現し、背景はほぼ黒で特徴がない。
18.1 特徴点と記述子
特徴マッチングの最初のステップは、画像から少数の「特徴的な」点を選び出すことである。どのような点が特徴的だろうか? 平坦な領域内の1画素は、近傍をどこに移動させても見た目が同じであり、識別の手がかりがない。エッジ上の点はエッジに沿ってスライドすると近傍がほとんど変化しないため、1つの方向しか特定できない。コーナー(corner)——グレースケール値が2つの独立した方向に沿って急激に変化する点——のみ、近傍がどの並進に対しても異なり、一意に「認識」することができる。これは チャプター 25 でコーナーが輪郭の顕著な点として機能するのと同じ直感に基づく。検出器は画像上で局所的な「コーナー度」が最も強く、閾値を超える位置を探索し、それらをキーポイントとする。
位置だけでは不十分であり、別の画像内で同じ点を認識できる必要がある。このため、各キーポイントの近傍に対して記述子(descriptor)を計算する。近傍のグレースケール値または勾配分布を特徴ベクトルに符号化し、その点の「指紋」とする。2枚の画像間で記述子が最も近い点のペアが、候補の対応(correspondence)となる。回転後の同じコーナーが類似の指紋を保持するために、記述子は計算前に近傍の主方向を推定し、近傍を標準的な向きに回転させてから符号化する。これが回転不変性(rotation invariance)の由来であり、角度は総当たり探索ではなく、記述子によって「吸収」される。
これこそが、疎なマッチングがコスト面で優位に立つ鍵である。稠密なテンプレートマッチングは姿勢空間を走査しなければならない。位置\(\times\)角度\(\times\)スケールの格子で、各格子点でテンプレート全体の比較を行うため、角度範囲が2倍になるとコストも2倍になる。特徴マッチングは処理パイプラインを3つのステップに分割する。キーポイントの検出(画像ごとに1回、姿勢に依存しない)、数十個の記述子の比較、最後に候補の対応から姿勢を求解する。姿勢空間は最初から最後まで列挙されることがない。候補の対応には誤認識された外れ値(outlier)が不可避的に混入するため、姿勢の求解にはRANSACを用いる。最小点数の点集合を繰り返しランダムに抽出して剛体(または相似)変換を当てはめ、その変換の下で一致する対応の数——内点(inlier)——を集計する。内点が最も多い変換が採用され、姿勢は全内点を用いた最小二乗法で精密化される。
RANSACは チャプター 14 で直線を当てはめる際にすでに使用した。外れ値で汚染されたデータの中で、「最小サンプルをランダムに抽出し、コンセンサスに投票する」手法は最小二乗法よりもはるかにロバストである。当時の外れ値は迷入したエッジ点だったが、ここでの外れ値は誤認識された記述子の対応であり、手法は全く同じである。
簡単なコスト計算:本章のサンプルでグレースケールマッチングを用いて\(1^\circ\)刻みで\(360^\circ\)をカバーするには、360個のテンプレート姿勢を用意してそれぞれ走査する必要がある。特徴マッチングはキーポイントを1回検出し(ここでは探索画像あたり約410個)、\(335\times{\sim}410\)程度の記述子ペアの中から対応を見つけるだけであり、角度範囲がどれほど広がっても、このコストは変わらない。
もちろん、ただで得られるものは何もない。特徴マッチングには、テンプレートに十分な数の検出可能なコーナーがあることが要求される。滑らかでテクスチャのない部品(円盤、無地の板)はキーポイントがほとんど得られず、モデルを構築することができない。本章のローター鋳物は正反対の事例であり、サンドブラスト加工された表面と穴、溝、アーム先端の至る所にコーナーがあり、特徴マッチングに「友好的な」対象である。しかし、別の現実的な問題が生じる。ほぼ5回回転対称であることだ。幾何学的に自己相似な部品では、異なるアーム上の記述子が互いに似通っており、姿勢が「ずれた」コンセンサスに収束しやすい。これが次節で直面するエンジニアリング上の落とし穴である。
18.2 特徴マッチング実験
テンプレートはrotor_001から得られる。まず部品を輝度で閾値処理して重心(\((533.3,492.6)\))を求め、それを中心に\(480\times 480\)の正方形を切り出す(図 18.1 (a))。STABLE検出器を用いてテンプレート上で学習を行い、335個のモデル特徴点が得られた(図 18.2)。これらはサンドブラスト表面、貫通穴と溝のエッジ、アーム先端など、コーナー度が最も強い場所に密に分布している。同一のモデルにより、3枚の\(1000\times 800\)探索画像からそれぞれ約410個のシーンキーポイント(420 / 414 / 406)が検出された。
実サンプルには正解姿勢のアノテーションがないため、2つの独立した証拠を用いてマッチング品質を検証する。1つ目は答えが既知の自己マッチングである。モデルを自身の元画像であるrotor_001内で探索すると、テンプレートの原点に戻るはずである。実測の位置は\((533.00,493.00)\)、角度は\(0.000^\circ\)、スケールは\(1.0000\)であり、テンプレートの原点\((533,493)\)に対する誤差は0.00 pxであった。これにより、「切り出し—モデル化—探索」の一連の処理系の零点校正ができた。2つ目は輝度重心との照合である。ローターはほぼ中心対称であるため、その輝度重心は特徴マッチングとは完全に無関係な安定した物理的参照である。求解された中心がこれと一致すれば、両者が相互に妥当性を裏付け合うことになる。
3枚の画像のマッチング結果(図 18.3)は明確であり、すべてが最も厳しいマッチング閾値60で一発で命中した。
| 探索画像 | 求解された中心 | 角度 | スケール | 輝度重心 | 中心誤差 |
|---|---|---|---|---|---|
rotor_002 |
\((558.72,458.24)\) | \(-44.97^\circ\) | \(0.9996\) | \((558.6,457.8)\) | 0.43 px |
rotor_003 |
\((701.58,239.17)\) | \(-149.99^\circ\) | \(0.9995\) | \((701.1,239.4)\) | 0.51 px |
rotor_004 |
\((308.59,558.20)\) | \(-44.98^\circ\) | \(1.0000\) | \((308.6,557.8)\) | 0.37 px |
中心誤差はすべて0.5 px程度であり、スケールは例外なく\(1.000\)の\(0.05\%\)以内に収まっている。これは「同一カメラ、同一ワーキングディスタンス、部品はスケールしていない」という物理的事実と完全に一致しており、結果の妥当性を強く裏付ける証拠である。マッチャーに角度範囲を全く指定しなかったことに注意されたい。\(-45^\circ\)から\(-150^\circ\)までの回転は、記述子とRANSACによって自然に吸収された。また、微妙だが重要な点として、求解された角度(\(-45^\circ\)、\(-150^\circ\))は5回対称のステップである\(72^\circ\)の整数倍ではない。これは、マッチングが回転対称によって「対称性によって等価な解」に流されることなく、鋳物の固有のサンドブラストテクスチャによって真の絶対姿勢を固定したことを意味する。
この実験により、教科書にはほとんど記載されていないが、製造ラインでは方案を台無しにしかねないエンジニアリング上の現実が明らかになった。それは記述子の選択である。最初の試行ではSTABLE検出器+ STABLE記述子(マニュアルの「ロバスト」なデフォルトの組み合わせ)を使用した。自己マッチングは完璧でrotor_003も3.6 pxで位置決めできたが、rotor_002とrotor_004は両方とも大幅に位置ずれした。中心がそれぞれ183 pxと52 pxずれ、スケールは\(1.06\)と\(0.78\)に漂った。さらに、マッチング閾値を10まで大幅に緩和してようやく結果が得られた。根本原因は前節で述べたほぼ5回回転対称にある。STABLE記述子は自己相似なアーム間を識別する能力に欠けており、RANSACは回転によってずれた解にコンセンサスを投票してしまったのだ。FAST記述子に切り替えたところ、3枚の画像すべてが厳しい閾値60で命中し、中心誤差は0.5 pxに減少し、スケールは\(1.00\)に戻った。同一の検出器、同一のキーポイントセットで、記述子を変更しただけで結果は雲泥の差となった。教訓は次の通りである。幾何学的に自己相似な部品では、記述子の識別能力が検出器の点数よりも重要である。「デフォルトパラメータ」は必ずしも自身の部品用に調整されているわけではなく、競合するパラメータに対して実測で簡単なスイープを行うことは、マニュアルを読むよりも早く答えを見つけられることが多い。
もう1つSDKの仕様上の注意点として、matchCountを2に設定しても、FindFeatureImageModelは1回の呼び出しにつき1つのインスタンスしか返さない。RANSACは内点が最も多い単一の変換を選び、その目には次点のインスタンスの対応は単なる外れ値の山に過ぎないのだ。本章の各画像にはちょうど1つの部品しか含まれていないため、画像ごとに1回呼び出せば十分である。しかし、1枚の画像に複数の同じ部品が含まれている場合は、アプリケーション層で「1つ見つける→画像からそれを消去する→さらに探す」という反復処理を行う必要がある。
最後に、疎なマッチングのロバスト性の由来について一言しておく価値がある。図 18.3 で写像されたモデル点が各部品に精密に一致しているのは、姿勢が点群の幾何的な一致性によって決定されるからであり、個々の点の精度によるものではない。検出器は「コーナー度」しか認識しないため、個々の候補対応が誤ったアームや背景の明るいスポットに接続されることは不可避である。それらを一つ一つ排除できるのは、335個のモデル点がすべて同時に定位置に収まらなければならないという厳しい制約によるものである。疎なマッチングのロバスト性は、個々の点の精度にあるのではなく、点群の一致にある。
18.3 色の表現とマッチング
場面を変えよう:コンベア上を赤、緑、青、黄の4種類のボトルキャップが流れており、それらを選別するのが課題である。ここでは幾何学的特徴は完全に不要で——キャップはいずれも円形である——重要なのは色だけである。最も単純な方法は、領域の平均色を3次元ベクトル \((R,G,B)\) として扱い、各参照色とのユークリッド距離を計算して、距離が最も小さいものを選ぶ方法である。
この方法には落とし穴がある:RGB は輝度と色度を結合してしまうという点である。同じ赤いキャップでも照明が3割暗くなると、\((R,G,B)\) の3成分がほぼ等しい割合で減少する。色ベクトルは原点を向く放射線に沿って移動し、人間の目には「同じ赤」に見えても、参照色とのユークリッド距離は大きくなる。生産ラインでは蛍光灯の劣化、電圧の変動、ワークと照明の距離のばらつきにより、輝度は決して一定ではない。生のRGB距離で選別を行うことは、分類閾値を照明の安定性に賭けるようなものである。
解決策は、色から輝度を除去し、「色の比率」だけを残すことである——これが色度(chromaticity)である。最も単純な色度座標は正規化RGBである:
\[ r = \frac{R}{R+G+B}, \qquad g = \frac{G}{R+G+B}, \]
(\(b\) は \(r+g+b=1\) から求められる)。3成分すべてに共通のゲインを乗じると、分子と分母が同時にスケーリングされるため、\((r,g)\) は全く変化しない。線形な輝度変化が完全に除去されるこの仕組みは、NCCが正規化によって照明ゲインを除去する(チャプター 16)のと同じ考え方を色空間に応用したものである。HSV空間における色相H、彩度S、明度Vの分離(チャプター 7 のカラー二値化で既に使用した)も同じ考え方の別の実装であり、工学的な効果は同等である。
幾何学的なイメージ:RGB空間において「同じ色で明るさが異なる」点は原点を通る放射線上に並ぶ。色度正規化は、各放射線を \(R+G+B=\text{常数}\) の平面上の1点に射影する。分類はこの平面上で行われ、輝度の次元は完全に折りたたまれる。
色マッチング器はクラスごとに1つのモデルを作成して使用する:各参照色ごとに1つの色モデルを学習させ、検査対象の領域を各モデルでスコアリングして、最もスコアの高いものを予測クラスとする。その内部の色表現が色度化されているかどうかは、マニュアルに明記されていないことが多い——しかし実験によってそれを明らかにすることができる。
18.4 色マッチング実験
本節では合成データを使用する:前述の特徴マッチングで使用したSmart3のサンプル画像はシングルチャンネルのグレースケールであり色情報を持たない。そのため SciSvColorMatch の使用法を完全に示し、その内部の色表現を調べるために、色票の選別場面を作成する。参照サンプルは4つのボトルキャップの色票(赤/緑/青/黄、各画素の各チャンネルに \(\pm 10\) の一様ノイズを重畳、図 18.4)である。テストセットは \(3\times 4\) のグリッドである(図 18.5):4列が4種類の色に対応し、3行はキャップの輝度をそれぞれ \(0.8\times\)、\(1.0\times\)、\(1.2\times\) に乗じたもの——照度と反射率の \(\pm 20\%\) の変動をシミュレートしている。
分類結果は明確である:12/12 すべて正解であり、真クラスのスコアは81.7~92.9の範囲に収まり、最も強い誤クラスに対する平均マージンは約 40点——僅差での勝利ではなく、圧倒的な勝利である。
しかし本実験の真の注目点は正解率ではなく、輝度スイープである。行ごとに真クラスの平均スコアを集計すると:
| 輝度 | \(0.8\times\) | \(1.0\times\) | \(1.2\times\) |
|---|---|---|---|
| 真クラス平均スコア | 91.0 | 89.9 | 84.1 |
輝度が \(20\%\) 変動しても、スコアの曲線はほぼ平坦であり——最大の低下幅はわずか 5.8点 である。もしマッチング器が内部で生のRGB距離を使用していれば、\(\pm 20\%\) の輝度変化によって色ベクトルは参照色からかなり離れ、スコアは大幅に低下するはずである。平坦な曲線は別の結論を示唆する:本SDKの色マッチング動作は、生のRGB距離ではなく色度空間に近い。\(1.2\times\) 行に見られるわずかな低下にも妥当な説明が存在する:黄色キャップのRチャネル参照値は210であり、これに\(1.2\)を乗じると252となって既に上限の255に近接しており、\(\pm 10\)の雑音を重畳するとクランプされて切断される。飽和によって色度が実際にシフトしたため、減点は妥当なものである。
方法論上の詳細で展開する価値のある点がもう1つある。我々は2つの手作りベースラインも同時に実行した:円盤平均値に対する生のRGB距離による分類と、色度距離による分類である——結果はいずれも12/12であった。これは4色分別タスク自体が単純すぎることを示している:赤、緑、青、黄の色相は互いに大きく離れており、\(\pm 20\%\)の輝度変化では生のRGBが失敗するほどではないため、正解率という指標は「SDKが色度ベースか否か」についてまったく判別力を持たない。2つの仮説を区別できるのはスコア曲線の形状である:生のRGB仮説は輝度に伴ってスコアが明確に低下すると予測するのに対し、色度仮説は曲線が平坦であると予測する——実測値は後者を支持した。実験を設計する際には、競合する説明に異なる予測を提示させる必要がある。そうでなければ、どれほど見栄えの良い数値が得られても単なる自己満足に過ぎない。
18.5 SciVision 実装
特徴マッチングは SCIMV::SciSvFeatureMatch が担当し、学習と探索の2段階で行われる:
SCIMV::SciSvFeatureMatch fm;
SciROI mask; // デフォルトコンストラクト = UNDEF、画像全体を意味する(必ずこうすること!)
SciMatchModel model;
fm.CreateFeatureImageModel(tmplImg, mask,
SCI_FEATUREMATCH_DETECTOR_STABLE, // detectorMethod: 0=STABLE 1=FAST 2=EDGEPOINT
SCI_FEATUREMATCH_DESCRIPTOR_FAST, // descriptorMethod: 本パーツ実測で FAST が STABLE を大きく上回る
/*sampleStep*/ 1, // サンプリングステップ:1/2/4、大きいほど点が疎になり高速
/*scaleRange*/ 0, // スケールレベル 0..3、0 = スケール拡張なし
/*detectorThreshold*/ 30, // コーナー応答閾値 [1,255]、高いほど点が少なくなる
&model);
SciFeaturePointArray pts;
fm.GetFeatureModelPoints(model, &pts); // 本例では 335 個のモデル特徴点
SciPointArray centers; SciVarArray angles, scales;
fm.FindFeatureImageModel(sceneImg, roi, model,
SCI_FEATUREMATCH_MATCHER_STABLE,
/*matcherThreshold*/ 60, // マッチング品質下限 [1,100]、本例では厳しい 60 段階で全て命中
/*matchCount*/ 1, // 注意:どれだけ大きくしてもインスタンスは 1 つしか返さない
¢ers, &angles, &scales);学習側で最も決定的なのは閾値の大小ではなく、descriptorMethod の選択である:本章の回転対称に近い回転子では、STABLE 記述子は類似のアームを区別できず、位置をずれたコンセンサスに解いてしまう一方、FAST 記述子は安定する(セクション 18.2 参照)。detectorThreshold と sampleStep は点の密度と速度を制御する;scaleRange はパーツの距離が変動する可能性がある(例:カメラ高さが固定されていない)場合に限り、有効にする必要がある。探索側の matcherThreshold は セクション 18.2 で議論されるインライア率のゲートである——記述子を適切に選べば、本例の3枚の画像は最も厳しい 60 の設定で全て命中する。返される angles は数学的な正の向き(反時計回りが正)に従う;y 軸が下向きの画像座標で位置姿勢を描画するには、符号を反転させて換算する必要がある——これはグレースケールマッチング(チャプター 16)と同じ慣習の落とし穴である。
カラーマッチングは SCIMV::SciSvColorMatch が担当する:
SCIMV::SciSvColorMatch cm;
SciROI cmask; // 同様に UNDEF でなければならない
SciMatchModel cmodel;
cm.CreateColorImageModel(refImg, cmask,
/*pyramidLevel*/ -1, // -1 = ピラミッド層数を自動選択
SCI_COLOR_SENSITIVITY_HIGH, // 色感度 0..2
&cmodel);
SciPointArray ctr; SciVarArray ang, score;
cm.FindColorImageModel(gridImg, cellROI, cmodel,
/*minScore*/ 1, /*matchCount*/ 1, /*overlapRatio*/ 50,
/*startAngle*/ 0, /*angleExtent*/ 10, /*angleStep*/ 1, // extent は 10 以上でなければならない
&ctr, &ang, &score);分類時には、各被検 ROI に対して4つのモデルそれぞれで FindColorImageModel を1回呼び出し、最もスコアの高いものを採用する;あるモデルが異なる色の領域で「マッチングなし」(122407002)を返すのは正常な現象であり、0点として扱えばよい。
実測で遭遇した5つの落とし穴を、ありのまま記録する:
- 記述子の選択が成否を分ける。同じ検出器、同じキーポイントセットでも、回転対称に近い回転子上で STABLE 記述子は
rotor_002/004を位置誤りで検出し(中心が 183 px / 52 px ずれ、スケールが \(1.06\) / \(0.78\) にドリフト)、FAST 記述子は3枚の画像全てで厳しい閾値 60 で命中し、誤差は \(\le 0.5\) px であった。幾何学的に自己相似なパーツでは、必ず両方の記述子を実測で検証せよ。 - mask は UNDEF で渡さなければならない。2つの
Create*Modelのmaskパラメータは、画像全体を表すデフォルトコンストラクトされた SciROI で渡さなければならない;GenRect1の全画像矩形を渡すと、特徴マッチングでは「特徴点が不足」(122406005)が報告され、カラーマッチングでは学習は「成功」するがその後のマッチングが失敗する(122407002)。 FindFeatureImageModelは単一インスタンスのセマンティクスを持つ。matchCountをどれだけ大きくしても、返されるインスタンスは1つだけである;複数インスタンスはアプリケーション層で「検出 → 消去 → 再検出」の反復で処理しなければならない。GetFeatureImagePointsは逆に矩形 ROI を要求する。Create とは正反対で、UNDEF ROI を渡すと 122406101 が報告される;GenRect1(0,0)-(W,H)の全画像矩形(右下隅は排他)を渡さなければならない。同系列の API の ROI セマンティクスを当然のように想定してはならない。FindColorImageModelのangleExtentを 0 にしてはならない。パッチは明らかに回転していないにもかかわらず、angleExtent=0は間欠的に 122407002 を返す;一律で \(\ge 10\) を渡すと安定した。間欠的な失敗は安定した失敗よりも原因追及が難しいので、遭遇した場合はまず境界値パラメータを疑え。
完全な実行可能プロジェクトは code/feature_color_matching/ にある。
産業事例:端子色選別における照明変動
あるコネクタ工場ではハウジングの色で端子を選別していた;初版の方案は RGB 空間で固定の閾値ボックスを用いて分類していた。数ヶ月運用後、誤判率が月々上昇した。調査の結果、工場の蛍光灯の経年劣化により色温度と照度が複合的にドリフトしたことが判明した:RGB 閾値ボックスは検収当日の照明下でキャリブレーションされており、ランプが変わると色ベクトルが全体的にボックス外に平行移動してしまったのである。改善は2段階で行われた:特徴面では色度座標(正規化 RGB)を用いて分類するよう変更し、輝度次元を事前に分離した;さらに視野の隅に白色のリファレンスタイルを固定し、毎シフトごとにその実測 RGB からホワイトバランスゲインを再計算し、残留する色温度ドリフトを補正した。改造後、誤判率は低下し安定した。教訓は2つある:色タスクでは「輝度チャンネル」を特徴から分離しなければならない;またシステムに経時的に校正可能な「白」を残す必要がある——照明は常に変化しており、変化する環境にはそれに追従して変化するリファレンスが必要である。
18.6 まとめ
- 特徴マッチング = キーポイント + 記述子 + 幾何学的一貫性:コーナー性の強い疎なキーポイントを検出し、回転正規化された記述子で候補の対応を構築し、RANSAC が外点の中から位置姿勢を投票で解く——位置姿勢空間が列挙されないため、大きな角度やスケール変化のコストは稠密マッチングよりもはるかに低い。本章では実際の回転子サンプルを使用した:335個のモデル点と約410個のシーン点のマッチングで、3枚の画像で同じパーツが異なる位置姿勢で出現し、全ての中心誤差が \(\le 0.5\) px、スケールは \(1.000\) で固定された(自己マッチング誤差 0.00 px でリンクのゼロ点校正を実施)。
- 疎マッチングのロバスト性は、個々の点の精度ではなく、群全体の一致にある:個々のキーポイントは誤ったアームや背景の輝点に対応付けられることがあるが、335個のモデル点全てが同時に定位置に収まるという幾何学的一貫性によって、それらは位置姿勢から除外される;代償として、テンプレートはコーナーが豊富でなければならず、滑らかでテクスチャのないパーツには適用できない。
- 工学的現実:記述子の選択が幾何学的自己相似パーツの決め手となる。回転対称に近い回転子上で STABLE 記述子は位置誤りを起こし(50~180 px ずれ)、FAST 記述子だけが3枚の画像全てを厳しい閾値 60 で安定して検出した;さらに
FindFeatureImageModelは呼び出しごとに1つのインスタンスしか返さないため、複数インスタンスには「検出-消去-再検出」が必要である。 - 色の分類には色度を用い、生の RGB を用いてはならない:正規化 \(r=R/(R+G+B)\) のような色度座標は色から輝度を除くため、照明変動下でも分類が安定する;本SDKで実測したところ、\(\pm 20\%\) の輝度走査で真クラスのスコアはたった5.8ポイントしか低下せず、色度空間に近い挙動を示した。
- 判別力のある実験を設計せよ:4色選別タスクでは生の RGB ベースラインですら満点を取るため、正解率では仮説を区別できない;区別できるのは輝度に対するスコア曲線の形状である——競合する仮説が異なる予測を出す場合に限り、データが発言権を持つ。
疎な特徴マッチングの3つの柱にはそれぞれ基礎となる文献がある:コーナー検出の Harris–Stephens オペレータ (Harris と Stephens 1988)、検出と記述をスケール不変へと推し進めた Lowe の SIFT (Lowe 2004)、そしてバイナリ記述子で処理を大幅に高速化した Rublee らの ORB (Rublee ほか 2011) である。特徴点、記述子、色に基づく認識については、Steger らの著作でより体系的に論じられている (Steger, Ulrich, と Wiedemann 2018)。





