2012-04-01 13 views
17

Estoy haciendo un programa en C++ que utiliza 2 imágenes para detectar características de SURF, calcule las coincidencias con un bruteforcematcher y lo dibuja.OpenCV - referencia indefinida: SurfFeatureDetector y BruteForceMatcher

Aquí está el código

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

edificio no es un problema, pero cuando se une, me sale esto muy desagradables errores:

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 

verdad es que no sé cuál es el problema. No encontré nada en Internet. ¡Espero que alguien pueda ayudar!

Editar: Este es mi 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

Tengo exactamente el mismo problema, ¿cómo incluyó opencv_features2d? Hice SET (OpenCV_LIBRARIES opencv_core opencv_highgui opencv_imgproc opencv_features2d) pero no funcionó. – rajat

Respuesta

41

Si está utilizando opencv 2.4, las interfaces SURF y SIFT se cambian a la carpeta no libre. Puede usarlo incluyendo esta línea

#include <opencv2/nonfree/features2d.hpp> 

luego puede usar SurfFeatureDetector como antes.

+2

Agregue también como bibliotecas dinámicas para vincular libopencv_nonfree.so y libopencv_features2d.so –

0

verdad es que no sé cuál es el problema.

El problema es probablemente una línea de enlace incorrecta. Desafortunadamente, usted no dijo que su línea de enlace es, por lo que no se podría brindar ayuda adicional. Leer this puede ser útil.

+0

Mis disculpas, me olvidé de eso.Edita la primera publicación. –

+1

Lo encontré: Olvidé incluir una biblioteca (opencv_features2d). –

8

Para SURF, @Mingyi Wu ha respondido. Para BruteForceMatcher, por favor

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

tuve este problema después de OpenCV actualización de 2.3.1 a 2.4.5, y he resuelto este problema que une opencv_nonfree, y añadir las cabeceras necesarias para mi proyecto:

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

¿Cómo enlaza opencv_nonfree? –

0

Tuve un problema similar después de instalar ROS. El problema era que estaba vinculando a las bibliotecas incorrectas.

que fija los errores de enlace, añadiendo la siguiente línea a mi CMakeLists.txt: link_directories(/opt/ros/groovy/lib)

Cuestiones relacionadas