OpenCV - undefined reference: SurfFeatureDetector et BruteForceMatcher
Je suis en train de faire un programme en C++ qui utilise 2 images pour détecter les VAGUES Fonctions, calculer les matchs avec un bruteforcematcher et il dessine.
Voici le code
#include <cstdio>
#include <string>
#include <vector>
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include "opencv2/features2d/features2d.hpp"
using namespace cv;
using namespace std;
int main(int argc, char **argv){
if (argc <3) {
cout << "Usage: " << argv[0] << " imageLocation1 imageLocation2" << endl;
return -1;
}
Mat source1 = imread(argv[1],CV_LOAD_IMAGE_GRAYSCALE);
Mat source2 = imread(argv[2],CV_LOAD_IMAGE_GRAYSCALE);
if(source1.empty() || source2.empty()){
printf("Can't load all the images!");
return -1;
}
//Initialise the Wrapping Class for Surf()
SurfFeatureDetector detector(400);
//detect : first param: Image, second param: vector (output)
vector<KeyPoint> keypoints1,keypoints2;
detector.detect(source1,keypoints1);
detector.detect(source2,keypoints2);
//Initialise wrapping class for descriptors computing using SURF() class.
SurfDescriptorExtractor extractor;
//Compute: Input:image, keypoints Output:descriptors
Mat descriptors1,descriptors2;
extractor.compute(source1,keypoints1,descriptors1);
extractor.compute(source2,keypoints2,descriptors2);
//Initialise BruteForceMatcher: For each descriptor in the first set, this matcher finds the closest descriptor in the second set by trying each on (=brute)
BruteForceMatcher< L2<float> > matcher;
vector< DMatch > matches;
//match: execute the matcher!
matcher.match(descriptors1,descriptors2, matches);
//Draw the matches with drawMatches
Mat target;
drawMatches(source1,keypoints1,source2,keypoints2,matches,target);
imshow("Matches", target);
waitKey(0);
return 0;
}
Bâtiment n'est pas un problème, mais lors de la liaison, je reçois ce très méchant erreurs:
CMakeFiles/opg13.dir/src/lennart_martens_opgave13.o: In function `cv::BruteForceMatcher<cv::L2<float> >::~BruteForceMatcher()':
lennart_martens_opgave13.cpp:(.text._ZN2cv17BruteForceMatcherINS_2L2IfEEED2Ev[_ZN2cv17BruteForceMatcherINS_2L2IfEEED5Ev]+0xb): undefined reference to `cv::DescriptorMatcher::~DescriptorMatcher()'
CMakeFiles/opg13.dir/src/lennart_martens_opgave13.o: In function `cv::BruteForceMatcher<cv::L2<float> >::~BruteForceMatcher()':
lennart_martens_opgave13.cpp:(.text._ZN2cv17BruteForceMatcherINS_2L2IfEEED0Ev[_ZN2cv17BruteForceMatcherINS_2L2IfEEED5Ev]+0x12): undefined reference to `cv::DescriptorMatcher::~DescriptorMatcher()'
CMakeFiles/opg13.dir/src/lennart_martens_opgave13.o: In function `main':
lennart_martens_opgave13.cpp:(.text.startup+0x172): undefined reference to `cv::SurfFeatureDetector::SurfFeatureDetector(double, int, int, bool)'
lennart_martens_opgave13.cpp:(.text.startup+0x24f): undefined reference to `cv::FeatureDetector::detect(cv::Mat const&, std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> >&, cv::Mat const&) const'
lennart_martens_opgave13.cpp:(.text.startup+0x30a): undefined reference to `cv::FeatureDetector::detect(cv::Mat const&, std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> >&, cv::Mat const&) const'
lennart_martens_opgave13.cpp:(.text.startup+0x346): undefined reference to `cv::SurfDescriptorExtractor::SurfDescriptorExtractor(int, int, bool, bool)'
lennart_martens_opgave13.cpp:(.text.startup+0x495): undefined reference to `cv::DescriptorExtractor::compute(cv::Mat const&, std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> >&, cv::Mat&) const'
lennart_martens_opgave13.cpp:(.text.startup+0x4bb): undefined reference to `cv::DescriptorExtractor::compute(cv::Mat const&, std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> >&, cv::Mat&) const'
lennart_martens_opgave13.cpp:(.text.startup+0x5ac): undefined reference to `cv::DescriptorMatcher::match(cv::Mat const&, cv::Mat const&, std::vector<cv::DMatch, std::allocator<cv::DMatch> >&, cv::Mat const&) const'
lennart_martens_opgave13.cpp:(.text.startup+0x6de): undefined reference to `cv::drawMatches(cv::Mat const&, std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> > const&, cv::Mat const&, std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> > const&, std::vector<cv::DMatch, std::allocator<cv::DMatch> > const&, cv::Mat&, cv::Scalar_<double> const&, cv::Scalar_<double> const&, std::vector<char, std::allocator<char> > const&, int)'
lennart_martens_opgave13.cpp:(.text.startup+0x781): undefined reference to `cv::DescriptorMatcher::~DescriptorMatcher()'
lennart_martens_opgave13.cpp:(.text.startup+0x7ad): undefined reference to `vtable for cv::SurfDescriptorExtractor'
lennart_martens_opgave13.cpp:(.text.startup+0x7b5): undefined reference to `cv::DescriptorExtractor::~DescriptorExtractor()'
lennart_martens_opgave13.cpp:(.text.startup+0x7d8): undefined reference to `vtable for cv::SurfFeatureDetector'
lennart_martens_opgave13.cpp:(.text.startup+0x7e0): undefined reference to `cv::FeatureDetector::~FeatureDetector()'
lennart_martens_opgave13.cpp:(.text.startup+0x8c8): undefined reference to `vtable for cv::SurfFeatureDetector'
lennart_martens_opgave13.cpp:(.text.startup+0x8d0): undefined reference to `cv::FeatureDetector::~FeatureDetector()'
lennart_martens_opgave13.cpp:(.text.startup+0x942): undefined reference to `vtable for cv::SurfDescriptorExtractor'
lennart_martens_opgave13.cpp:(.text.startup+0x94a): undefined reference to `cv::DescriptorExtractor::~DescriptorExtractor()'
lennart_martens_opgave13.cpp:(.text.startup+0x9a2): undefined reference to `cv::DescriptorMatcher::~DescriptorMatcher()'
CMakeFiles/opg13.dir/src/lennart_martens_opgave13.o:(.rodata._ZTVN2cv17BruteForceMatcherINS_2L2IfEEEE[vtable for cv::BruteForceMatcher<cv::L2<float> >]+0x10): undefined reference to `cv::DescriptorMatcher::add(std::vector<cv::Mat, std::allocator<cv::Mat> > const&)'
CMakeFiles/opg13.dir/src/lennart_martens_opgave13.o:(.rodata._ZTVN2cv17BruteForceMatcherINS_2L2IfEEEE[vtable for cv::BruteForceMatcher<cv::L2<float> >]+0x14): undefined reference to `cv::DescriptorMatcher::clear()'
CMakeFiles/opg13.dir/src/lennart_martens_opgave13.o:(.rodata._ZTVN2cv17BruteForceMatcherINS_2L2IfEEEE[vtable for cv::BruteForceMatcher<cv::L2<float> >]+0x18): undefined reference to `cv::DescriptorMatcher::empty() const'
CMakeFiles/opg13.dir/src/lennart_martens_opgave13.o:(.rodata._ZTVN2cv17BruteForceMatcherINS_2L2IfEEEE[vtable for cv::BruteForceMatcher<cv::L2<float> >]+0x20): undefined reference to `cv::DescriptorMatcher::train()'
CMakeFiles/opg13.dir/src/lennart_martens_opgave13.o:(.rodata._ZTVN2cv17BruteForceMatcherINS_2L2IfEEEE[vtable for cv::BruteForceMatcher<cv::L2<float> >]+0x24): undefined reference to `cv::DescriptorMatcher::read(cv::FileNode const&)'
CMakeFiles/opg13.dir/src/lennart_martens_opgave13.o:(.rodata._ZTVN2cv17BruteForceMatcherINS_2L2IfEEEE[vtable for cv::BruteForceMatcher<cv::L2<float> >]+0x28): undefined reference to `cv::DescriptorMatcher::write(cv::FileStorage&) const'
CMakeFiles/opg13.dir/src/lennart_martens_opgave13.o:(.rodata._ZTVN2cv17BruteForceMatcherINS_2L2IfEEEE[vtable for cv::BruteForceMatcher<cv::L2<float> >]+0x30): undefined reference to `cv::BruteForceMatcher<cv::L2<float> >::knnMatchImpl(cv::Mat const&, std::vector<std::vector<cv::DMatch, std::allocator<cv::DMatch> >, std::allocator<std::vector<cv::DMatch, std::allocator<cv::DMatch> > > >&, int, std::vector<cv::Mat, std::allocator<cv::Mat> > const&, bool)'
CMakeFiles/opg13.dir/src/lennart_martens_opgave13.o:(.rodata._ZTVN2cv17BruteForceMatcherINS_2L2IfEEEE[vtable for cv::BruteForceMatcher<cv::L2<float> >]+0x34): undefined reference to `cv::BruteForceMatcher<cv::L2<float> >::radiusMatchImpl(cv::Mat const&, std::vector<std::vector<cv::DMatch, std::allocator<cv::DMatch> >, std::allocator<std::vector<cv::DMatch, std::allocator<cv::DMatch> > > >&, float, std::vector<cv::Mat, std::allocator<cv::Mat> > const&, bool)'
CMakeFiles/opg13.dir/src/lennart_martens_opgave13.o:(.rodata._ZTIN2cv17BruteForceMatcherINS_2L2IfEEEE[typeinfo for cv::BruteForceMatcher<cv::L2<float> >]+0x8): undefined reference to `typeinfo for cv::DescriptorMatcher'
collect2: ld gaf exit-status 1 terug
make[2]: *** [bin/opg13] Fout 1
make[1]: *** [CMakeFiles/opg13.dir/all] Fout 2
make: *** [all] Fout 2
Je ne sais vraiment pas quel est le problème. Je n'ai pas trouver une chose à l'Internet. J'espère que quelqu'un pourra vous aider!
Edit: C'est mon CMakeLists.txt:
cmake_minimum_required(VERSION 2.4)
PROJECT(LABO5)
# paths
INCLUDE_DIRECTORIES(src)
INCLUDE_DIRECTORIES(/usr/local/include)
LINK_DIRECTORIES(/usr/local/lib)
LINK_DIRECTORIES(/usr/lib)
SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin)
SET(CMAKE_CXX_FLAGS "-o3 -w")
SET(CMAKE_CXX_LINK_FLAGS "-pg")
SET(OpenCV_LIBRARIES opencv_core opencv_highgui opencv_imgproc )
ADD_EXECUTABLE(opg13 src/lennart_martens_opgave13.cpp)
TARGET_LINK_LIBRARIES(opg13 ${OpenCV_LIBRARIES})
SET(CMAKE_BUILD_TYPE Release)
- Je rencontre exactement le même problème , comment avez-vous d'inclure opencv_features2d ? Je n'ai MIS(OpenCV_LIBRARIES opencv_core opencv_highgui opencv_imgproc opencv_features2d) mais il ne fonctionne pas .
Vous devez vous connecter pour publier un commentaire.
Si vous êtes en utilisant opencv 2.4, de SURF et de passer au crible les interfaces sont changé non libre de dossier. Vous pouvez l'utiliser, y compris cette ligne
ensuite, vous pouvez utiliser SurfFeatureDetector comme avant.
De SURF, @Wu Mingyi ont répondu. Pour BruteForceMatcher, veuillez
si vous utilisez opencv2.4 ou tronc de svn, de SURF et de passer au crible les interfaces sont modifiées.
http://code.opencv.org/projects/opencv/wiki/ChangeLog
Le problème est probablement incorrecte de la ligne de liaison. Malheureusement, vous n'avez pas dit ce que votre ligne de liaison est, donc aucune aide supplémentaire ne pourrait être accordée. La lecture cette peut être utile.
J'ai eu un problème similaire après l'installation de ROS. Le problème était que j'étais reliant à la mauvaise bibliothèques.
J'ai corrigé les erreurs de lien en ajoutant la ligne suivante à mon CMakeLists.txt:
link_directories(/opt/ros/groovy/lib)
pour ocv 2.4.9:
#include <opencv2/nonfree/features2d.hpp>
est l'emplacement de SURF. Dans le projet Paramètres sélectionnez Propriétés de Configuration, puis de l'éditeur de liens, puis Entrée puis ajouter opencv_nonfree249d.lib à Dépendances Supplémentaires. Avec ceux de l'exemple suivant de ocv documentation fonctionne très bien 🙂 http://docs.opencv.org/doc/tutorials/features2d/feature_detection/feature_detection.html#feature-detectionJ'ai eu ce problème après la mise à niveau OpenCV à partir 2.3.1 pour 2.4.5, et je l'ai résolu ce problème en reliant opencv_nonfree, et ajoutez les en-têtes pour mon projet: