knnMatch()上的OpenCV FlannBasedMatcher分段错误

时间:2013-06-03 21:43:54

标签: c++ opencv

我正在使用OpenCV的FlannBasedMatcher来匹配来自Kinect的相机图像和一些样本图像之间的关键点。我编写了以下方法来处理cv::Mat图像:

cv::SurfFeatureDetector feature_detector;
cv::SurfDescriptorExtractor descriptor_extractor;

// Contains all the information we need about an image
struct ImageInfo
{
  int                       width,
                            height;
  std::vector<cv::KeyPoint> keypoints;
  cv::Mat                   descriptors;
  cv::FlannBasedMatcher     matcher;
};

void ObjectRecognizer::getImageInfo(const cv::Mat& image, ImageInfo& image_info)
{
  image_info.width  = image.cols;
  image_info.height = image.rows;
  // Detect keypoints
  feature_detector.detect(image, image_info.keypoints);
  // Compute descriptors
  descriptor_extractor.compute(image, image_info.keypoints, image_info.descriptors);
  // Train matcher
  std::vector<cv::Mat> descriptor_vector;
  descriptor_vector.push_back(image_info.descriptors);
  image_info.matcher.add(descriptor_vector);
  image_info.matcher.train();
}

我调用此方法从我的相机图像和样本图像中获取ImageInfo结构。

如果我使用我的相机图像中的描述符训练匹配器并使用我的样本图像中的描述符调用方法,一切正常(因为它不仅运行,我实际上能够检测相机内的样本图像图像):

cam_img_info.matcher.knnMatch(sample_info.descriptors, matches, 2);

如果我反过来这样做并尝试使用经过样本图像描述符训练的匹配器,我会得到一个分段错误:

sample_info.matcher.knnMatch(cam_img_info.descriptors, matches, 2);

如果我使用空的cv::Mat来匹配训练的样本描述符,它运行得非常好(但当然我无法检测到我的相机图像中的任何对象):

cv::Mat descs;
sample_info.matcher.knnMatch(descs, matches, 2);

关于可能出现什么问题的任何想法?

0 个答案:

没有答案