0

数時間の調査の後、一致したキーポイントが属する「列車」画像のインデックスをまだ見つけることができません。私が意味するのは

FeatureDetector surfDetector = FeatureDetector.create(FeatureDetector.FAST);

MatOfKeyPoint vector = new MatOfKeyPoint();

surfDetector.detect( mImg, vector );

DescriptorExtractor siftDescriptor =DescriptorExtractor.create(DescriptorExtractor.BRIEF);

Mat descriptors=new Mat();

siftDescriptor.compute(mImg, vector, descriptors);

DescriptorMatcher matcherBruteForce=DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2);

List<MatOfDMatch> matches = new ArrayList<MatOfDMatch>(); 

matcherBruteForce.match(descriptors, descriptors, matches, 2);

例として同じ画像を使用します。この後、一致したキーポイントが属する「列車」画像のインデックスを見つける方法は?

4

2 に答える 2

2

何かが欠けていると思います。おそらく、特定のオブジェクトを見つけようとし、いくつかの画像のコレクションで、探しているオブジェクトのキーポイントと「最もよく一致する」画像を見つけようとします。為に。提供されたサンプル コードを見るだけで、未知の画像のすべての SIFT/SURF キーポイントを抽出し、オブジェクト キーポイントと現在の画像の間にマッチャーを適用します。必要なのは、画像間の一致度を示す何らかのメトリックです。最も単純なものは、一致したキーポイントの数のカウントです。次に、コレクション内のどの画像が一致したキーポイントの最大数につながったかを覚えておく必要があります。一致するキーポイントの数は、おそらく使用するのに最適なメトリックではありません。

ところで、あなたのコードはかなり紛らわしいです: surfDetector という名前の機能検出器を宣言していますが、"FAST" 検出器をインスタンス化しています。siftDescriptor という名前の機能エクストラクタを宣言しますが、"BRIEF" エクストラクタをインスタンス化します。SURF検出器/抽出器など、存在する場合は同じ検出器と抽出器を保持することをお勧めします。

于 2012-09-18T12:42:36.820 に答える
1

これがあなたが探しているものだと思います。変数名をケースに合わせてください:

//scene = query; object = train

Point point1 = keypoints_scene.get( matches.get(i).queryIdx ).pt;

Point point2  = keypoints_object.get( matches.get(i).trainIdx ).pt ;

最適な一致を見つけるには、次のようにします。各一致には距離というパラメーターがあります。距離が最も小さいものがベスト マッチです。それで、すべての一致のリストを調べて、距離が最も小さいものを見つけます...

float min_dist = Float.MAX_VALUE;
int min_position = 0;
for( int i=0; i<matches.size(); i++) {
   if( matches.get(i).distance < min_dist ) {
      min_dist = matches.get(i).distance;
      min_position = i;
   }                    
}

Point best_point_scene   = keypoints_scene.get( matches.get(min_position).queryIdx ).pt;
Point best_point_object  = keypoints_object.get( matches.get(min_position).trainIdx ).pt ;
于 2012-09-18T10:34:16.300 に答える