Я пытаюсь сопоставить ключевые точки 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]);
, показанный в исходном сообщении.
matcher.match(templateDescriptor, descriptors_1, matches);
Я предполагаю, что вы хотели передать загруженные дескрипторы функции, а не узел файла хранилища, из которого вы уже прочитали дескрипторы - person Micka   schedule 14.01.2015no 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.2015std::vector<cv::KeyPoint> templateDescriptor;
на тип, который вы использовали при записи в файл node. Вероятно что-то вродеstd::vector<cv::Mat> templateDescriptor;
Я имею в виду типdescriptors_1
на момент написания. - person Micka   schedule 14.01.2015std::vector<cv::KeyPoint> keypoints_1;
std::vector<cv::KeyPoint> descriptors_1;
два вектора, которые я использовал для записи, должны быть одного типа? Или я неправильно понял? - person Colin747   schedule 14.01.2015cv::Keypoint
, поэтому у вас может быть какая-то ошибка. Я даже почти уверен, что это должно бытьcv::Mat
для дескриптора. Не могли бы вы поделиться строкой кода, в которой вы вычисляете ключевые точки и дескрипторы (включая объявления их параметров)? - person Micka   schedule 14.01.2015detectKeypointsImage
, если вы пытаетесь получить доступ к дескрипторам? Я думаю, что это не должно... измениться наcv::Mat descriptors_1;
иcv::Mat templateDescriptor;
, и все должно работать, если я правильно понимаю. - person Micka   schedule 14.01.2015