2012-04-01 10 views
17

Realizzo un programma in C++ che utilizza 2 immagini per rilevare le caratteristiche SURF, calcolare le corrispondenze con un bruteforcematcher e disegnarlo.OpenCV - riferimento non definito: SurfFeatureDetector e BruteForceMatcher

Ecco il codice

#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; 
} 

Costruire non è un problema, ma durante il collegamento, ottengo questo molto brutto errori:

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 

Io davvero non so quale sia il problema. Non ho trovato nulla su Internet. Spero che qualcuno possa aiutarti!

Edit: Questo è il mio 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) 
+0

Ho lo stesso identico problema, come hai incluso opencv_features2d? Ho fatto SET (OpenCV_LIBRARIES opencv_core opencv_highgui opencv_imgproc opencv_features2d) ma non ha funzionato. – rajat

risposta

41

Se si utilizza opencv 2.4, le interfacce SURF e SIFT vengono cambiate in cartelle non libere. È possibile utilizzarlo includendo questa riga

#include <opencv2/nonfree/features2d.hpp> 

quindi è possibile utilizzare SurfFeatureDetector come prima.

+2

Aggiungi anche come librerie dinamiche per collegare libopenc_nonfree.so e libopencv_features2d.so –

0

Io davvero non so quale sia il problema.

Il problema è molto probabilmente una linea di collegamento errata. Sfortunatamente, non hai detto quale sia la tua linea di collegamento , quindi non è possibile fornire ulteriore assistenza. Leggere this potrebbe essere utile.

+0

Le mie scuse, l'ho dimenticato.Modifica il primo post. –

+1

Trovato: ho dimenticato di includere una libreria (opencv_features2d). –

8

Per SURF, @Mingyi Wu ha risposto. Per BruteForceMatcher, si prega di

#include <opencv2/legacy/legacy.hpp> 
-1

Ho avuto questo problema dopo l'aggiornamento da OpenCV 2.3.1 a 2.4.5, e ho risolto questo problema che collega opencv_nonfree, e aggiungi le intestazioni necessarie per il mio progetto:

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/calib3d/calib3d.hpp" 
#include "opencv2/nonfree/features2d.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
+1

Come hai collegato opencv_nonfree ?? –

0

Ho avuto un problema simile dopo aver installato ROS. Il problema era che stavo collegando le librerie sbagliate.

ho fissato gli errori di collegamento aggiungendo la seguente riga al mio CMakeLists.txt: link_directories(/opt/ros/groovy/lib)