2015-01-14 2 views
1

Я пытаюсь сопоставить ключевые точки SURF с шаблоном изображения с тем, что отображается в видеоролике, но при попытке позвонить FlannBasedMatcher я получаю следующие ошибки.OpenCV - загрузка дескрипторов из yml - не соответствует вызову функции

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)

EDIT: код, где ключевые точки вычисляются и деклараций.

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]);, который показан на исходное сообщение.

+0

попробовать 'matcher.match (templateDescriptor, descriptors_1, спичка);' Я предполагаю, что вы хотите, чтобы передать загруженные дескрипторы функции, а не узел файла хранения от прочтения дескрипторов уже – Micka

+0

Это привело в очень похожей ошибке. Вместо «неизвестного преобразования для аргумента 1 из« cv :: FileNode »в« const cv :: Mat & »' я получил 'не известное преобразование для аргумента 1 из 'std :: vector ' to 'const cv :: Mat & '' – Colin747

+0

Загруженные дескрипторы должны быть переданы функции yes. – Colin747

ответ

2

Есть две проблемы в коде:

  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); вместо этого, так как вы хотите, чтобы соответствовать дескрипторы и не узел для хранения файлов.

Смежные вопросы