OpenCV简要描述符少于关键点

时间:2018-02-22 10:26:09

标签: opencv feature-extraction feature-detection

我正在使用OpenCV来检测功能和计算描述符。

对于特征检测,我使用FAST:

cv::Ptr<cv::FeatureDetector> _detector = cv::FastFeatureDetector::create(_configuration.threshold,
                                            _configuration.nonmaxSuppression);

对于我正在使用Brief的描述符:

cv::Ptr<cv::DescriptorExtractor> _descriptor_extractor = cv::xfeatures2d::BriefDescriptorExtractor::create();

之后,我想根据他们的回复订购关键点并存储一定数量的关键点:

typedef std::map<float,cv::KeyPoint,std::greater<float> > ResponseKeypointMap;

// keypoint buffer
std::vector<cv::KeyPoint> keypoints;
cv::Mat descriptors;

// detect keypoints
_detector->detect(rgb_image_, keypoints);

const int keypoints_size = keypoints.size();
if(!keypoints_size){
    std::cerr << "warning: [PointDetector] found 0 keypoints!\n";
    return;
}

ResponseKeypointMap keypoints_map;
for(int i=0; i < keypoints_size; ++i){
  keypoints_map.insert(std::make_pair(keypoints[i].response,keypoints[i]));
}

int iterations = std::min(_configuration.max_keypoints_size,keypoints_size);
std::vector<cv::KeyPoint> filtered_keypoints;
filtered_keypoints.resize(iterations);
int k=0;

for(ResponseKeypointMap::iterator it = keypoints_map.begin();
    it != keypoints_map.end();
    ++it){
  filtered_keypoints[k] = it->second;
  k++;

  if(k>=iterations)
    break;
}

std::cerr << "filtered keypoints size: " << filtered_keypoints.size() << std::endl;

_descriptor_extractor->compute(rgb_image_, filtered_keypoints, descriptors);
std::cerr << "Computed " << descriptors.rows << "x" << descriptors.cols << " descriptors" << std::endl;

我不知道为什么我要给DescriptorExtractor提供100个关键点,但我收到了55个描述符。

如果你能解释我发生的事情,我将非常感激。

感谢。

2 个答案:

答案 0 :(得分:1)

根据OpenCV文档https://docs.opencv.org/2.4/modules/features2d/doc/common_interfaces_of_descriptor_extractors.html

  

DescriptorExtractor :: compute(const Mat&amp; image,vector&amp; keypoints,Mat&amp; descriptors)
  ...
  关键点 - 输入关键点的集合。关键点a   描述符无法计算被删除,其余的可能   被重新安排。有时可以添加新的关键点,例如:SIFT   复制具有多个主导方向的关键点(对于每个   方向)。
  ......

因此,在执行 compute 方法后,您的 filtered_keypoints 向量会被更改,并且您有一对新的关键点和描述符,大小均为55.

答案 1 :(得分:0)

尤其是,FAST在每个测试点周围绘制一个直径为7的圆环,以确定它是否是关键点,但是Brief会在测试点周围使用256个点。我不知道Brief是使用正方形区域还是圆形区域,但是无论哪种方式,它都会更大,因此FAST可能会发现关键点离图像的边界太近,以至于Brief无法计算描述。