OpenCV を使用して、入力ビデオストリーム内の形状(十字)を検出しようとしています。現在、かなりうまく機能するクロスのバイナリイメージを取得するためにしきい値を設定しています。残念ながら、抽出されたブロブがクロスであるかどうかを判断する私のアルゴリズムは、あまりうまく機能しません。下の画像でわかるように、特定の視点ですべてのコーナーが検出されるわけではありません。
findContours()
とapproxPolyDP()
を使用して、輪郭の近似値を取得しています。この近似曲線で12個のコーナー/頂点を検出している場合、ブロブはクロスであると見なされます。
この問題を解決するためのより良い方法はありますか? [〜#〜] sift [〜#〜] について考えましたが、アルゴリズムはリアルタイムで実行する必要があり、SIFTはリアルタイムにはあまり適していないことを読みました。
どちらかについては定かではありませんが、興味深い結果が得られる可能性のある提案がいくつかあります。
十字架が常に画像の中心近くにあり、常に平面上にある場合は、カメラと十字架が置かれている平面との間のホモグラフィを見つけることができます。これにより、十字のサンプル画像を(平面回転の異なるものを選択して)視覚化された十字の座標系に変換できます。次に、画像に一致させることができるテンプレートを生成できます。いくつかの簡単なピクセル一致テストを実行して、一致するかどうかを判断できます。
または、クロスを認識するように Haarベースの分類子 をトレーニングすることもできます。このタイプの分類器は、顔検出でよく使用され、画像内の方向付けられたエッジを検出し、いくつかの方向付けられたエッジの相対位置によって顔を分類します。顔の分類精度が高く、非常に高速です。この特定の状況での正確さを保証することはできませんが、十字架などの単純な形状に対してはいくつかの良い結果が得られる可能性があります。