9

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

このような理由から、SIFT の作成者が非常に優れていると述べた投票を試してみたいと思います。

4 次元の特徴空間で投票する必要があることを読みました。4 次元は次のとおりです。

  • 場所 [x, y] (誰かが翻訳と言う)
  • 規模
  • オリエンテーション

opencv を使用すると、一致を取得するのは簡単ですが、scale次の場合orientation:

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

位置を計算する方法を理解するのに苦労しています。

バウンディング ボックスを描画できるのは、次のような興味深いスライドです。one match

しかし、たった 1 回のマッチでそのバウンディング ボックスを描画する方法がわかりません。何か助けはありますか?

4

3 に答える 3

5

画像 1 から画像 2 への幾何学的変換に適合する一致する特徴の最大のセットを探しています。この場合は、 translation (dx, dy)、 scale change ds、および rotationの 4 つのパラメーターを持つ相似変換d_thetaです。

画像 1 の f1 と画像 2 の f2 の特徴を一致させたとします。画像 1(x1,y1)の f1 の位置、s1縮尺、theta1向きを 同様に、f2 に対して(x2,y2)s2、およびがあります。theta2

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

2 つのフィーチャ間の縮尺変更は ですds = s2 / s1

2 つのフィーチャ間の回転は ですd_theta = theta2 - theta1

したがって、dxdyds、およびd_thetaはハフ空間の次元です。各ビンは相似変換に対応します。

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

于 2013-04-11T03:14:45.377 に答える
2

(w/2,h/2)ハフ変換を使用する場合、テンプレートの重心から (または中心モーメントを使用して)すべてのフィーチャの変位ベクトルを格納する署名を作成します。

たとえば、テンプレートで見つかった 10 個の SIFT フィーチャの場合、テンプレートの重心によるそれらの相対位置はvector<{a,b}>. では、クエリ イメージでこのオブジェクトを検索してみましょう。クエリ イメージで見つかったすべての SIFT フィーチャは、テンプレートの 10 個のいずれかと一致し、対応する重心に投票します。

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

これらの機能の一部が同じポイントで正常にキャストされた場合 (クラスタリングが不可欠です)、オブジェクト インスタンスが見つかりました。

ここに画像の説明を入力

署名と投票は逆の手順です。と仮定しましょうV=(-20,-10)。そのため、新しい画像の検索中に 2 つの一致が見つかった場合、それらの向きとサイズを検出し、それぞれの投票を行います。たとえば、右側のボックスの重心V'=(+20*0.5*cos(-10),+10*0.5*sin(-10))は、半分のサイズで -10 度回転しているため、SIFT フィーチャから離れます。

于 2013-04-11T07:28:14.540 に答える
2

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

次に、特徴の暫定的な一致によって得られた可能性のある類似度ごとに、4D 空間の対応するボックス (またはセル) に 1 を追加します。出力の類似度は、投票数の多いセルによって与えられます。

1 回のマッチから変換を計算するには、Dima の式を答えに使用するだけです。一致のペアがいくつかある場合は、いくつかの最小二乗法を使用する必要がある場合があります。

最後に、関数 を使用して変換を適用できますcv::warpPerspective()。ここで、透視行列の 3 行目を に設定し[0,0,1]ます。

于 2013-04-11T06:56:43.663 に答える