ProgRoman 9 Жалоба Опубликовано March 5, 2012 Добрый день, пытался запустить готовые детекторы из примеров, но что-то не особо получилось пример matcher_simple.cpp ниже тот же код что и в примере #include <stdio.h> #include <opencv2/core/core.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; void help() { printf("\nThis program demonstrates using features2d detector, descriptor extractor and simple matcher\n" "Using the SURF desriptor:\n" "\n" "Usage:\n matcher_simple <image1> <image2>\n"); } int main(int argc, char** argv) { if(argc != 3) { help(); return -1; } Mat img1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE); Mat img2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE); if(img1.empty() || img2.empty()) { printf("Can't read one of the images\n"); return -1; } // detecting keypoints SurfFeatureDetector detector(); vector<KeyPoint> keypoints1, keypoints2; detector.detect(img1, keypoints1); detector.detect(img2, keypoints2); // computing descriptors SurfDescriptorExtractor extractor; Mat descriptors1, descriptors2; extractor.compute(img1, keypoints1, descriptors1); extractor.compute(img2, keypoints2, descriptors2); // matching descriptors BruteForceMatcher<L2<float> > matcher; vector<DMatch> matches; matcher.match(descriptors1, descriptors2, matches); // drawing the results namedWindow("matches", 1); Mat img_matches; drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches); imshow("matches", img_matches); waitKey(0); return 0; } получил следующую ошибку Ошибка 2 error C2228: выражение слева от ".detect" должно представлять класс, структуру или объединение c:\documents and settings\мои документы\visual studio 2010\projects\testsapp\testsapp\testsapp.cpp 40 1 testsApp после исправления, исправленный код ниже // detecting keypoints SurfFeatureDetector detector(); vector<KeyPoint> keypoints1, keypoints2; detector().detect(img1, keypoints1); detector().detect(img2, keypoints2); // computing descriptors SurfDescriptorExtractor extractor(); Mat descriptors1, descriptors2; extractor().compute(img1, keypoints1, descriptors1); extractor().compute(img2, keypoints2, descriptors2); // matching descriptors BruteForceMatcher<L2<float> > matcher(); vector<DMatch> matches; matcher().match(descriptors1, descriptors2, matches); // drawing the results namedWindow("matches", 1); Mat img_matches; drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches); imshow("matches", img_matches); waitKey(0); получил следующую ошибку Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl cv::drawMatches(class cv::Mat const &,class std::vector<class cv::KeyPoint,class std::allocator<class cv::KeyPoint> > const &,class cv::Mat const &,class std::vector<class cv::KeyPoint,class std::allocator<class cv::KeyPoint> > const &,class std::vector<struct cv::DMatch,class std::allocator<struct cv::DMatch> > const &,class cv::Mat &,class cv::Scalar_<double> const &,class cv::Scalar_<double> const &,class std::vector<char,class std::allocator<char> > const &,int)" (?drawMatches@cv@@YAXABVMat@1@ABV?$vector@VKeyPoint@cv@@V?$allocator@VKeyPoint@cv@@@std@@@std@@01ABV?$vector@UDMatch@cv@@V?$allocator@UDMatch@cv@@@std@@@4@AAV21@ABV?$Scalar_@N@1@4ABV?$vector@DV?$allocator@D@std@@@4@H@Z) в функции _wmain c:\documents and settings\мои документы\visual studio 2010\Projects\testsApp\testsApp\testsApp.obj testsApp Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 5, 2012 ...LNK2019: ссылка на неразрешенный внешний символ... ошибка линкера - значит, скорее всего, не подключена какая-то либа. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано March 5, 2012 а что за либа может быть не подключена.. в доп зависимостях у меня следующие C:\OpenCV2.2\lib\opencv_core220d.lib C:\OpenCV2.2\lib\opencv_highgui220d.lib C:\OpenCV2.2\lib\opencv_video220d.lib C:\OpenCV2.2\lib\opencv_ml220d.lib C:\OpenCV2.2\lib\opencv_legacy220d.lib C:\OpenCV2.2\lib\opencv_imgproc220d.lib а в инклудах #include <stdio.h> #include <opencv2/core/core.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/highgui/highgui.hpp> Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 5, 2012 Лень проверять, но скорее всего одна из: (у меня версия 2.32) opencv_features2d232.lib opencv_objdetect232.lib opencv_flann232.lib Я обычно все вписываю Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано March 7, 2012 Большое спасибо, всё получилось у меня сейчас такой вопрос, какие пороги надо писать в сифте SiftFeatureDetector detector(); я пробовал так SiftFeatureDetector detector(40, 70); но никакого drawMatches не отображалось.. наверно пороги нужно брать другие?.. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано March 7, 2012 и у меня возник ещё вопрос для сопоставления дескрипторов я сейчас использую метод ближайших соседей встроенный у flann int knn=5; FlannBasedMatcher matchr; vector<DMatch> matches; matchr.knnMatch(descriptors1,descriptors2,matches,knn); он выдаёт ошибку, что может быть не так... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 7, 2012 По поводу порогов, можно сделать их адаптивными. То есть: Ставите сначала произвольно. Если детектируется меньше SIFT особенностей чем надо, снижаете порог (скажем на 5%). Если больше, то повышаете. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах