2012-04-01 10 views
17

私は、2つの画像を使ってSURF機能を検出し、その一致をbruteforcematcherで計算して描画するC++プログラムを作成しています。OpenCV - 未定義参照:SurfFeatureDetectorとBruteForceMatcher

は、ここでは、コード

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

ビルは問題ないですが、リンク時に、私はこの非常に厄介なエラーが出る:

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 

私は実際には問題が何であるかを知りません。私はインターネットで何かを見つけませんでした。誰かが助けることを願っています!

編集:私は実際には問題が何であるかを知らない

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

私はまったく同じ問題を抱えていますが、どうやってopencv_features2dを組み込みましたか?私はSET(OpenCV_LIBRARIES opencv_core opencv_highgui opencv_imgproc opencv_features2d)を実行しましたが、動作しませんでした。 – rajat

答えて

41

opencv 2.4を使用している場合、SURFおよびSIFTインターフェイスはnonfreeフォルダに変更されます。あなたはこの行を含めることでそれを使用することができます

#include <opencv2/nonfree/features2d.hpp> 

あなたは以前と同様にSurfFeatureDetectorを使用することができます。

+2

libopencv_nonfree.soとlibopencv_features2d.soをリンクするためのダイナミックライブラリとしても追加 –

0

:これは私のCMakeLists.txtです。

リンク線が正しくない可能性があります。残念ながら、あなたのリンクラインであるとは言わなかったので、それ以上の助けはできませんでした。読書thisが役に立ちます。

+0

私の謝罪、私はそれを忘れました。最初の投稿を編集します。 –

+1

見つけました:私はライブラリ(opencv_features2d)を含めるのを忘れました。 –

8

SURFについては、@Mingyi Wuが答えました。 BruteForceMatcherについては、してください

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

は私が2.3.1から2.4.5へのアップグレードOpenCVの後に、この問題を持っていた、と私はopencv_nonfreeを結ぶこの問題を解決し、そして私のプロジェクトのために必要なヘッダを追加しました:

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

opencv_nonfreeをどのようにリンクしましたか? –

0

ROSをインストールした後も同様の問題がありました。問題は、私が間違ったライブラリにリンクしていたことでした。

私は私のCMakeLists.txtに次の行を追加することにより、リンクエラーを修正:OCV 2.4.9用link_directories(/opt/ros/groovy/lib)