【问题标题】:OpenCV - loading descriptors from yml - no matching function callOpenCV - 从 yml 加载描述符 - 没有匹配的函数调用
【发布时间】:2015-03-12 12:12:00
【问题描述】:

我正在尝试将模板图像中的 SURF 关键点与视频源中显示的内容进行匹配,但在尝试调用 FlannBasedMatcher 时出现以下错误。

captureFromCam.cpp: In function ‘void matchAndDrawKeypoints(cv::Mat, IplImage*)’:
captureFromCam.cpp:110:55: error: no matching function for call to ‘cv::FlannBasedMatcher::match(cv::FileNode&, cv::Mat&, std::vector<cv::DMatch>&)’
captureFromCam.cpp:110:55: note: candidates are:
In file included from /usr/local/include/opencv/cv.h:68:0,
                 from captureFromCam.cpp:2:
/usr/local/include/opencv2/features2d/features2d.hpp:1110:18: note: void cv::DescriptorMatcher::match(const cv::Mat&, const cv::Mat&, std::vector<cv::DMatch>&, const cv::Mat&) const
/usr/local/include/opencv2/features2d/features2d.hpp:1110:18: note:   no known conversion for argument 1 from ‘cv::FileNode’ to ‘const cv::Mat&’
/usr/local/include/opencv2/features2d/features2d.hpp:1128:18: note: void cv::DescriptorMatcher::match(const cv::Mat&, std::vector<cv::DMatch>&, const std::vector<cv::Mat>&)
/usr/local/include/opencv2/features2d/features2d.hpp:1128:18: note:   no known conversion for argument 1 from ‘cv::FileNode’ to ‘const cv::Mat&’

我试图通过读取图像、计算关键点和描述符并将它们保存为yml 格式来做到这一点,如下所示:

// code to detect features/descriptors
...
  cv::FileStorage fs(fileNamePostCut + ".yml", cv::FileStorage::WRITE);
  write(fs, fileNamePostCut + "Keypoints_1", keypoints_1);
  write(fs, fileNamePostCut + "Descriptors_1", img_descriptors_1);
  fs.release();

然后我在一个单独的函数中尝试加载关键点和描述符并将它们与为视频流计算的值进行比较:

matchAndDrawKeypoints (cv::Mat img_1, IplImage* frames)
      std::vector<cv::KeyPoint> templateKeypoints;
      std::vector<cv::KeyPoint> templateDescriptor;
      cv::FileStorage fs2("VWlogo.yml", cv::FileStorage::READ);
      cv::FileNode kptFileNode = fs2["VWlogoKeypoints_1"];
      read(kptFileNode, templateKeypoints);
      cv::FileNode desFileNode = fs2["VWlogoDescriptors_1"];
      read(desFileNode, templateDescriptor);
      fs2.release();
      cv::FlannBasedMatcher matcher;
      std::vector<cv::DMatch> matches;
      matcher.match(desFileNode, img_descriptors_1, matches);

我假设问题是描述符没有从yml 文件正确加载,或者视频源的描述符没有正确传递。

以下只是关于信息流的一些额外信息:

main() 调用makeitgrey(frame) 调用detectKeypoints(grey_frame),它返回到makeitgrey(),它返回到main(),然后调用matchAndDrawKeypoints (img_1, frames)

编辑: 计算和声明关键点的代码。

cv::Mat img_keypoints_1;
cv::Mat img_1;
cv::Mat img_descriptors_1;
std::vector<cv::KeyPoint> keypoints_1;
std::vector<cv::KeyPoint> descriptors_1;

main() 将视频传递给 makeitgrey(),然后传递给:

IplImage* detectKeypointsImage (IplImage* img_1) {
  int minHessian = 400;
  cv::SurfFeatureDetector detector(minHessian);
  detector.detect(img_1, keypoints_1);
  drawKeypoints(img_1, keypoints_1, img_keypoints_1);
  cv::SurfDescriptorExtractor extractor;
  extractor.compute(img_1, keypoints_1, img_descriptors_1);
  return img_1;
}

模板图像作为命令行参数传入,然后传递给detectTemplateKeypoints(img_1, argv[1]);,如原始帖子所示。

【问题讨论】:

  • try matcher.match(templateDescriptor, descriptors_1, matches); 我假设您想将加载的描述符传递给函数,而不是您已经读取描述符的存储文件节点
  • 这导致了一个非常相似的错误。而不是no known conversion for argument 1 from ‘cv::FileNode’ to ‘const cv::Mat&amp;’ 我得到no known conversion for argument 1 from ‘std::vector&lt;cv::KeyPoint&gt;’ to ‘const cv::Mat&amp;’
  • 加载的描述符将被传递给函数yes。
  • std::vector&lt;cv::KeyPoint&gt; templateDescriptor; 更改为您在写入文件节点时使用的类型。可能是 std::vector&lt;cv::Mat&gt; templateDescriptor; 之类的东西
  • 如果您想添加答案,我很乐意接受?

标签: c++ opencv feature-detection surf flannbasedmatcher


【解决方案1】:

代码有两个问题:

  1. std::vector&lt;cv::KeyPoint&gt; templateDescriptor; 不是描述符的正确类型。用于描述符计算。在http://docs.opencv.org/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html 的示例代码中,您可以看到,一堆关键点的描述符通常类型为cv::Mat。所以改成cv::Mat templateDescriptor;cv::Mat descriptors_1;

  2. matcher.match(desFileNode, img_descriptors_1, matches); 必须改为 matcher.match(templateDescriptor, img_descriptors_1, matches);,因为您要匹配描述符而不是文件存储节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2018-04-21
    • 1970-01-01
    • 2012-10-16
    • 2017-10-05
    • 2011-12-14
    • 1970-01-01
    相关资源
    最近更新 更多