クロスを見つける必要があるバイナリ イメージのセットがあります (例を添付)。findcontours を使用して、バイナリ イメージから境界線を抽出します。しかし、この形状(境界線)が交差しているかどうかをどのように判断できるかわかりませんか?おそらく、opencv にはいくつかの組み込みメソッドがあり、この問題の解決に役立つ可能性があります。機械学習を使ってこの問題を解決しようと思ったのですが、もっと簡単な方法があると思います。ありがとう!
5 に答える
Viola-Jones のオブジェクト検出は、良い出発点になる可能性があります。アルゴリズム (AFAIK) の主な用途は顔検出ですが、実際には十字架などのオブジェクト検出用に設計されています。
アルゴリズムは機械学習ベースのアルゴリズムであり (したがって、分類された「クロス」のセットと分類された「クロスではない」のセットが必要になります)、重要な「特徴」(パターン) を識別する必要があります。アルゴリズムは十字を認識します。
アルゴリズムは OpenCV で次のように実装されます。cvHaarDetectObjects()
元の画像から、交差する可能性のあるポリゴンのセットを抽出したとしましょう。すべての十字が表示されていると仮定して、すべてのエッジが長さを持っていると識別できる範囲で、次のことを試すことができます。
ポリゴンを形成するのに必要な 12 個の頂点を正確に持たないすべてのポリゴンを拒否します。
最短のエッジ長が最初になるように頂点を並べ替えます。
頂点を均一サイズのクロスにマッピングする最適な透視変換を作成します
この変換を使用して生成された残差を調べて、クロスを一様クロスに投影します。ここで、特定のポイントの残差は、投影されたポイントと対応する一様ポイントの間の距離です。
- すべての残差が定義した許容範囲内にある場合、交差が見つかりました。
これは主に、検索している幾何学的形状が単純であるために機能することに注意してください。これを機能させるには、輪郭からノイズを除去する必要もあります。たとえば、十字内の各線を単一の単純な線に変換する必要があります。
各ブロブを侵食し、ピクセル数が減少していることを分析できます。クロスの回転スケーリングに関係なく、残りの中心を閉じる場合を除いて、常に同じ比率で下がる必要があります。繰り返しになりますが、ブロブが十分に小さい場合は、元のブロブの中心にあると予想する必要があります。これを解決するために、機械学習アルゴリズムやトレーニング データは必要ありません。
数日間の闘争の後、ここで唯一の堅牢な方法は SVM + HOG を使用することであるという結論に達しました。それで全部です。
要件に応じて、 SIFTやSURFなどのローカル機能検出器を試すことができます。後者の興味深い実装であるOpenSURFを確認してください。