OpenCV - загрузка дескрипторов из yml - нет соответствующего вызова функции

Я пытаюсь сопоставить ключевые точки 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]);, показанный в исходном сообщении.


person Colin747    schedule 14.01.2015    source источник
comment
попробуйте matcher.match(templateDescriptor, descriptors_1, matches); Я предполагаю, что вы хотели передать загруженные дескрипторы функции, а не узел файла хранилища, из которого вы уже прочитали дескрипторы   -  person Micka    schedule 14.01.2015
comment
Это привело к очень похожей ошибке. Вместо no known conversion for argument 1 from ‘cv::FileNode’ to ‘const cv::Mat&’ у меня получилось no known conversion for argument 1 from ‘std::vector<cv::KeyPoint>’ to ‘const cv::Mat&’   -  person Colin747    schedule 14.01.2015
comment
Загруженные дескрипторы необходимо передать в функцию yes.   -  person Colin747    schedule 14.01.2015
comment
измените std::vector<cv::KeyPoint> templateDescriptor; на тип, который вы использовали при записи в файл node. Вероятно что-то вроде std::vector<cv::Mat> templateDescriptor; Я имею в виду тип descriptors_1 на момент написания.   -  person Micka    schedule 14.01.2015
comment
std::vector<cv::KeyPoint> keypoints_1; std::vector<cv::KeyPoint> descriptors_1; два вектора, которые я использовал для записи, должны быть одного типа? Или я неправильно понял?   -  person Colin747    schedule 14.01.2015
comment
Я почти уверен, что дескрипторы не относятся к типу cv::Keypoint, поэтому у вас может быть какая-то ошибка. Я даже почти уверен, что это должно быть cv::Mat для дескриптора. Не могли бы вы поделиться строкой кода, в которой вы вычисляете ключевые точки и дескрипторы (включая объявления их параметров)?   -  person Micka    schedule 14.01.2015
comment
взгляните на этот пример и на то, как они объявляют/используют дескрипторы во время вычислений: docs.opencv.org/doc/tutorials/features2d/feature_flann_matcher/   -  person Micka    schedule 14.01.2015
comment
Надеюсь, это дополнительный код, который вы просили.   -  person Colin747    schedule 14.01.2015
comment
работает ли ваш detectKeypointsImage, если вы пытаетесь получить доступ к дескрипторам? Я думаю, что это не должно... измениться на cv::Mat descriptors_1; и cv::Mat templateDescriptor;, и все должно работать, если я правильно понимаю.   -  person Micka    schedule 14.01.2015
comment
Это компилируется без ошибок, большое спасибо за вашу помощь.   -  person Colin747    schedule 14.01.2015
comment
Если вы хотите добавить ответ, я с радостью приму?   -  person Colin747    schedule 14.01.2015


Ответы (1)


В коде две проблемы:

  1. std::vector<cv::KeyPoint> 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);, так как вы хотите сопоставить дескрипторы, а не узел хранения файлов.

person Micka    schedule 14.01.2015