如何根据响应对opencv KeyPoints进行排序?

时间:2012-06-06 08:37:27

标签: c++ opencv

我有一些OpenCV KeyPoints,它们存储为vector<KeyPoint>list<KeyPoint>。 如何根据KeyPoints的响应对它们进行排序以获得最佳的n个关键点?

问候。

3 个答案:

答案 0 :(得分:6)

查看文档,并猜测您正在尝试something like this

这是OpenCV中的how KeyPoint is implemented

所以根据我的理解,你想要使用的是响应元素:

float response; // the response by which the most strong keypoints have been selected. Can be used for the further sorting or subsampling

所以这绝对是我在你的情况下要做的。 创建一个函数,通过响应对矢量进行排序:)

希望这有帮助

编辑

试图利用Adrian的建议(这是我的第一个cpp代码,所以期望进行一些更正)

// list::sort
#include <list>
#include <cctype>
using namespace std;

// response comparison, for list sorting
bool compare_response(KeyPoints first, KeyPoints second)
{
  if (first.response < second.response) return true;
  else return false;
}

int main ()
{
  list<KeyPoints> mylist;
  list<KeyPoints>::iterator it;

  // opencv code that fills up my list

  mylist.sort(compare_response);

  return 0;
}

答案 1 :(得分:5)

我已将关键点存储为std::vector<cv::KeyPoint>,并按以下方式对其进行排序:

 std::sort(keypoints.begin(), keypoints.end(), [](cv::KeyPoint a, cv::KeyPoint b) { return a.response > b.response; });

注意:lambda-expression需要使用C ++ 11。

答案 2 :(得分:3)

如果将关键点存储在向量中:

#include <algorithm> // std::sort
#include <vector> // std::vector

int main() {
    std::vector<KeyPoint> keypoints;

    // extract keypoints right here

    std::sort(keypoints.begin(), keypoints.end(), response_comparator);

    // do what ever you want with keypoints which sorted by response
}

bool response_comparator(const KeyPoint& p1, const KeyPoint& p2) {
    return p1.response > p2.response;
}