42

OpenCVを使用して、入力ビデオストリームの形状(十字)を検出しようとしています。現在、かなりうまく機能するクロスのバイナリイメージを取得するためにしきい値を設定しています。残念ながら、抽出されたブロブがクロスであるかどうかを判断するための私のアルゴリズムは、あまりうまく機能しません。下の画像でわかるように、特定の視点ですべてのコーナーが検出されるわけではありません。

ここに画像の説明を入力してください

とを使用findContours()approxPolyDP()て、輪郭の近似値を取得しています。この近似曲線で12個のコーナー/頂点を検出している場合、ブロブはクロスであると見なされます。

この問題を解決するためのより良い方法はありますか?SIFTについて考えましたが、アルゴリズムはリアルタイムで実行する必要があり、SIFTはリアルタイムにはあまり適していないことを読みました。

4

2 に答える 2

9

興味深い結果が得られる可能性のある提案がいくつかありますが、どちらも定かではありません。

十字が常に画像の中心近くにあり、常に平面上にある場合、カメラと十字が存在する平面との間のホモグラフィを見つけることができます。これにより、クロスのサンプル イメージを (平面内で異なる回転を選択して) 視覚化されたクロスの座標系に変換できます。次に、画像に一致させることができるテンプレートを生成できます。一致するかどうかを判断するために、いくつかの簡単なピクセル一致テストを行うことができます。

または、クロスを認識するようにHaar ベースの分類器をトレーニングすることもできます。このタイプの分類器は、顔検出でよく使用され、画像内の向きのあるエッジを検出し、いくつかの向きのあるエッジの相対位置によって顔を分類します。顔の分類精度が高く、非常に高速です。この特定の状況での精度を保証することはできませんが、十字などの単純な形状では良い結果が得られる可能性があります。

于 2013-01-30T20:17:42.747 に答える
8

凸包を計算してから、凸性の欠陥を利用するとうまくいくかもしれません。

すべてのクロスには、2 つのポイントの 4 つのセット、または 4 つのベクトルを構成する 4 つの凸性欠陥がある必要があります。さらに、形状が十字の場合、これらの 4 つのベクトルは 2 対の補角を持ちます。

于 2013-02-02T09:29:03.513 に答える