opencv - OpenCV简短描述符少于关键点

标签 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个描述符。

如果您能解释一下发生了什么,我将不胜感激。

谢谢。

最佳答案

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

DescriptorExtractor::compute(const Mat& image, vector& keypoints, Mat& descriptors)
...
keypoints – Input collection of keypoints. Keypoints for which a descriptor cannot be computed are removed and the remaining ones may be reordered. Sometimes new keypoints can be added, for example: SIFT duplicates a keypoint with several dominant orientations (for each orientation).
...



因此,在执行compute 方法之后,您的filtered_keypoints vector 将被更改,并且您将拥有一对新的关键点和描述符,大小均为55。

关于opencv - OpenCV简短描述符少于关键点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48925015/

相关文章:

c++ - 访问负像素值 OpenCV

opencv - 在OpenCV中重新分配给Mat

opencv - 在OpenCV中编译

python - 如何计算文档对和查询之间的相似度?

c# - EmguCV (OpenCV) ORBDetector 只发现坏匹配

opencv - 针对 ARM 优化的 FAST 计算

c++ - OpenCV:如何使用掩码参数进行特征点检测(SURF)

c++ - OpenCV如何提取图像 channel

matlab - 灰度分割/特征提取/ Blob 检测?

computer-vision - 从 SuperPixels 中提取特征的最佳方法,例如 gabor 和 HOG 特征