1

FAST検出器から取得したキーポイントの数を制限するAndroid用のコードを書いています(現在、約9000のキーポイントを取得しています)。レスポンスに基づいて、最高の 500 個のキーポイントを保持したいと考えています。これらのキーポイントを応答に従ってソートできるコンパレーターを作成しました。ここで、500 個の最高のキーポイントを取得する方法を見つけて、これらを新しいリストに入れたいと考えています。

ここに私が持っているコードがあります

// gets the keypoints from the detector, and puts them in a list
List<KeyPoint> pointstest = points1.toList();
                // comparator orders the keypoints (check image for output)
                order(pointstest);
                    // make a new list to put the 500 best keypoints in
                List<KeyPoint> nieuw = new ArrayList<KeyPoint>();

そのため、最高のポイントでリストを「再作成」する必要がありますが、現在、これを修正する方法にこだわっています。誰か提案がありますか?たぶん for ループを考えていたのですが、これらのキーポイントに対して実装できますか?

4

3 に答える 3

2

実際には、@Ashwini Bhangi と @Peter Lawrey の提案を組み合わせる必要があります。最初にリストを並べ替えてから、0 から 499 までのサブリストを取得します。

コンパレータは正式Comparator<T>に、あなたの場合Comparator<KeyPoint>はそうです:

int count = 500;
Collections.sort(keypoints, new Comparator<KeyPoint>() {
    public int compare(KeyPoint o1, KeyPoint o2) {
        //TODO add code for deciding values to compare on
        // Note that here you should implement DESCENDING logic 
        // to get greater values at the beginning, not at the end
        return value;
   }
});

次に、サブリストを取得します。

List<KeyPoint> theBest = new ArrayList<KeyPoint>(keypoints.subList(0, count));

元のリストを並べ替えると、元のリストが変更されることに注意してください。元のリストを保存したい場合は、並べ替える前にコピーを作成する必要があります。

于 2013-04-29T19:48:53.133 に答える
0

500 個のリストから必要な値を選択できるように、コレクションの並べ替えを使用します。

    List<Object> sortedArray = new ArrayList<Object>(count);
    Collections.sort(sortedArray, new Comparator<Object>() {
            public int compare(Object o1, Object o2) {
                    //TODO add code for deciding values to compare on
            return value;
           }
    });
于 2013-04-29T19:33:45.227 に答える
0

どうですか

List<KeyPoint> nieuw = new ArrayList<KeyPoint>(pointstext.subList(0, 500));
于 2013-04-29T19:32:19.310 に答える