OpenCV と SURF メソッドを使用して交通標識認識エンジンを実装しようとしています。私の問題は、ランダムな結果が得られることです (時には本当に正確な場合もあれば、明らかに間違っている場合もあります)。その理由を理解できません。比較を実装する方法は次のとおりです。
- まず、画像の輪郭を検出します
- 次に、各等高線で SURF を使用して、交通標識が内側にあるかどうか、およびどの交通標識かを調べます。
輪郭検出は完全にうまく機能します:ガウスぼかしとキャニーエッジを使用して、これに似た輪郭を見つけることができます:
次に、この輪郭に対応する画像を抽出し、この画像を次のような交通標識テンプレート画像と比較します。
cvExtractSURF は、輪郭画像の 189 個の記述子を返します。次に、naiveNearestNeighbor メソッドを使用して、輪郭画像と各テンプレート画像の類似点を見つけます。
ここに私の結果があります:
最初のテンプレートの6/189 (これは私が見つけようとしているものです)
2 番目のテンプレートの場合は92/189 (これは明らかに輪郭画像とはあらゆる点で大きく異なります)
これらの結果がよくわかりません…</p>
私が実行する手順のリストは次のとおりです。
- 輪郭画像をグレースケールにする
- テンプレート画像をグレースケールにする
- 輪郭画像のヒストグラムを均等化する (cvEqualizeHist)
- テンプレート画像のサイズを変更して、輪郭画像に一致させます
- テンプレート画像をぼかします (cvSmooth)
- 輪郭画像をぼかす (cvSmooth)
- テンプレート画像で cvExtractSURF を実行します
- 輪郭画像で cvExtractSURF を実行します
- 輪郭画像の記述子ごとに、naiveNearestNeighbor を実行します
- 「いい」点数を貯める
2 つの画像の類似性を評価するには、比率を使用します。
goog ポイント数 / 記述子の総数
PS: 詳細については、このチュートリアルに従いました: http://www.emgu.com/wiki/index.php/Traffic_Sign_Detection_in_CSharp
OpenCV の find_obj サンプルを使用して、C に適応させました。