1

我正在为 Android 编写代码以限制我从 FAST 检测器获得的关键点数量(现在我得到了大约 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 回答