2013-04-11 27 views
9

私はSIFT + RANSACとホモグラフィを使ってオブジェクト(OpenCV C++、Java)を見つけるアプリケーションを開発しています。私が直面している問題は、多くの外れ値がある場合、RANSACのパフォーマンスが低いことです。SIFTの一致と認識?

この理由から、私はSIFTの著者がかなり良いと言ったことを試してみたいと思います。

私たちは4次元である4次元の特徴空間に投票すべきことを読みました:

  • 場所[X、Y](誰かがTraslationが言う)
  • スケール
  • オリエンテーション

ながらOpenCVのではとの一致scaleorientationを取得することは容易です

cv::Keypoints.octave 
cv::Keypoints.angle 

私は場所をどのように計算することができるのか分かりません。

は私だけone matchで、我々はバウンディングボックスを描画することができますinteresting slideを発見した:

しかし、私はちょうど1試合でそのバウンディングボックスを描くことができるか、私は得ることはありません。どんな助け?

答えて

5

イメージ1からイメージ2への幾何変換に適合する一致したフィーチャの最大セットを探しています。この場合、相似変換には変換(dx, dy)、縮尺変更ds、回転d_theta

のは、あなたが機能に適合しているとしましょう:画像2.レッツから画像1とf2からf1は、画像1にf1の位置であるs1は、その規模もしましょう、とtheta1が、それは向きだことましょう(x1,y1)。同様に、f2については(x2,y2),s2theta2です。

2つの機能間の変換は(dx,dy) = (x2-x1, y2-y1)です。

2つの機能間のスケール変更はds = s2/s1です。

2つの機能間のローテーションはd_theta = theta2 - theta1です。

したがって、dx,dy,dsおよびd_thetaは、ハフスペースの寸法です。各ビンは類似性変換に対応する。

ハフ投票を実行して最大のビンを見つけたら、そのビンはイメージ1からイメージ2への変換を行います。イメージ1のバウンディングボックスを取得し、その変換を使用して変換することができます。対応する平行移動、回転、およびスケーリングを画像のコーナーに適用します。通常、パラメータを変換行列にパックし、同次座標を使用します。これにより、検出したオブジェクトに対応する画像2の境界ボックスが表示されます。

+0

私は答えを編集しました。 – Dima

+1

1つのマッチでは、ハフ変換は必要ありません。あなたは、xとyの違い(平行移動)、方向の違い(回転)、およびスケールの比(スケール)を取る。次にそれらを行列に入れます。 – Dima

2

Dimaを完成させるには、4D Hough空間が(おそらくは小さな)4Dボックスに量子化されることを追加する必要があります。各ボックスは、その中心によって与えられる類似性に対応します。

次に、フィーチャの暫定的なマッチングによって得られる可能性のある類似性ごとに、4D空間内の対応するボックス(またはセル)に1を追加します。出力類似度は、より多くの票を有するセルによって与えられる。

1マッチからの変換を計算するには、彼の答えにDimaの式を使用してください。数組のマッチでは、最小自乗適合を使用する必要があります。

最後に、変換は、cv::warpPerspective()関数で適用できます。ここでは、透視マトリックスの3行目が[0,0,1]に設定されています。

+0

これは、単一のマッチだけで境界ボックスを描画する方法を説明していません。 – dynamic

+0

境界ボックスは、モデル画像上の青色と黄色のボックスに最終的な類似性(Huff投票から得られたもの)斬新なイメージで – sansuiso

+0

最終的な類似性行列を計算する方法の例を掲載できますか? – dynamic

2

ハフ変換を使用する場合は、テンプレートの重心(すべての特徴の変位ベクトルを格納するシグネチャ(またはセントラルモーメントの助けを借りて)を作成します。

など。テンプレート上にある10個のSIFT特徴について、テンプレートの重心に基づくそれらの相対位置は、vector<{a,b}>である。ここでは、クエリーイメージ内でこのオブジェクトを検索します。クエリーイメージ内に見つかったすべてのSIFTフィーチャが、テンプレートの10のいずれかと一致して、対応するセントロイドに投票をキャストします。

votemap(feature.x - a*, feature.y - b*)+=1ここで、a、bはこの特定の特徴ベクトルに対応します。

これらの機能のいくつかが同じ時点で正常に実行された場合(クラスタリングが不可欠な場合)、オブジェクトインスタンスが見つかりました。

enter image description here

署名と投票は、逆の手順です。 V=(-20,-10)としましょう。したがって、斬新なイメージを検索する際に、2つのマッチが見つかると、それらのオリエンテーションとサイズを検出し、それぞれの投票をキャストします。例えば。右のボックスのセントロイドはSIFT機能から離れてV'=(+20*0.5*cos(-10),+10*0.5*sin(-10))になります。これは、サイズが半分で、-10度回転しているためです。

+0

「一試合」とは何を意味しますか?一致した機能の性質は何ですか?あなたの例の黄色いボックスのようなポイント(x、y)またはエリア(x、y、a、b、theta)? – William

+0

次に、SIFT ** Descriptor **をシグネチャに含め、一致したパッチの回転とスケーリングをDescriptorMatcherから抽出する必要があります。 – William

関連する問題