web-dev-qa-db-ja.com

OpenCVで画像内の十字を検出する

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

Enter image description here

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

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

42
Tobi

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

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

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

9
Max Allan

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

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

8
David Wurtz