38

ここには、類似した画像を見つける方法に非常に役立つトピックがいくつかあります。

私がやりたいことは、写真の指紋を取得し、デジタル カメラで撮影したさまざまな写真から同じ写真を見つけることです。SURF アルゴリズムは、スケーリング、角度、およびその他の歪みに依存しないための最良の方法であると考えられます。

サンプル画像の特徴を抽出するために、SURF アルゴリズムで OpenCV を使用しています。今、このすべての特徴データ (位置、ラプラシアン、サイズ、向き、ヘシアン) をフィンガープリントまたはハッシュに変換する方法を考えています。

このフィンガープリントはデータベースに保存され、検索クエリはそのフィンガープリントをほぼ同じ特徴を持つ写真のフィンガープリントと比較できなければなりません。

アップデート:

すべての記述子ベクトルを単純なハッシュに変換する方法はないようです。では、クエリを高速化するために画像記述子をデータベースに格納する最良の方法は何でしょうか?

ボキャブラリーツリーはオプションですか?

どんな助けにもとても感謝しています。

4

4 に答える 4

9

あなたが言及した特徴データ(位置、ラプラシアン、サイズ、向き、ヘシアン)は目的には不十分です(マッチングを行いたい場合、これらは実際には記述子の関連性の低い部分です)。見たいデータは「記述子」(4 番目の引数) です。

void cvExtractSURF(const CvArr* image, const CvArr* mask, CvSeq** keypoints, CvSeq** descriptors, CvMemStorage* storage, CvSURFParams params)

これらは、特定の機能の「指紋」を含む 128 または 64 (パラメーターに応じて) のベクトルです (各画像には、可変量のそのようなベクトルが含まれます)。Opencv の最新バージョンを入手すると、find_obj.cpp という名前のサンプルがあり、マッチングにどのように使用されるかを示しています。

更新:

このディスカッションは役に立つかもしれません

于 2010-01-27T19:52:20.810 に答える
3

ハッシュを計算する簡単な方法は次のとおりです。画像からすべての記述子を取得します (たとえば、N 個)。各記述子は 128 個の数値のベクトルです (0 ~ 255 の整数に変換できます)。したがって、N*128 整数のセットがあります。それらを次々と文字列に書き込んで、それをハッシュ値として使用するだけです。ハッシュ値を小さくしたい場合は、文字列のハッシュ関数を計算する方法があると思うので、記述子を文字列に変換してから、その文字列のハッシュ値を使用します。

正確な重複を見つけたい場合は、これでうまくいくかもしれません。しかし、(スケール、回転などについて話しているので)「類似の」画像を見つけたいだけのようです。その場合、ハッシュを使用することはおそらく良い方法ではありません。SURF記述子を計算するポイントを見つけるために、おそらく何らかの関心点検出器を使用します。同じポイントのセットが異なる順序で返されると想像してください。画像と記述子が同じであっても、ハッシュ値は突然大きく異なります。

したがって、同様の画像を確実に見つけなければならない場合は、別のアプローチを使用します。たとえば、SURF 記述子をベクトル量子化し、ベクトル量子化された値のヒストグラムを作成し、ヒストグラムの交差をマッチングに使用できます。本当に絶対にハッシュ関数を使用する必要がありますか (おそらく効率のために)、または類似の画像を見つけるために何でも使用したいだけですか?

于 2010-01-30T01:22:19.977 に答える
2

GIST を使用する方が適切なようです。

http://people.csail.mit.edu/torralba/code/spatialenvelope/には MATLAB コードがあります。

于 2010-02-08T20:24:36.467 に答える