2012-04-01 25 views
17

मैं सी ++ में एक प्रोग्राम बना रहा हूं जो एसयूआरएफ फीचर्स का पता लगाने के लिए 2 छवियों का उपयोग करता है, ब्रूटफोर्समैचर के साथ मैचों की गणना करता है और इसे खींचता है।ओपनसीवी - अपरिभाषित संदर्भ: सर्फफेचर डिटेक्टर और ब्र्यूटफोर्समैचर

यहाँ कोड

#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 को कैसे शामिल किया? मैंने एसईटी किया (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) शामिल करना भूल गया। –

1

यदि आप ओपनसीवी 2.4 या एसवीएन, एसयूआरएफ और एसआईएफटी इंटरफेस से ट्रंक का उपयोग कर रहे हैं तो बदल रहे हैं। http://code.opencv.org/projects/opencv/wiki/ChangeLog

8

एसयूआरएफ के लिए, @ मिंगी वू ने उत्तर दिया है। लिए 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

मुझे आरओएस स्थापित करने के बाद भी एक ही समस्या थी। समस्या यह थी कि मैं गलत पुस्तकालयों से जुड़ा था। link_directories(/opt/ros/groovy/lib)

0

OCV 2.4.9 के लिए: #include <opencv2/nonfree/features2d.hpp> सर्फ के स्थान है

मैं अपने CMakeLists.txt को निम्न पंक्ति जोड़कर लिंक त्रुटियों को सुधारा। परियोजना में सेटिंग विन्यास गुण, तो लिंकर, तो इनपुट चयन और फिरके अतिरिक्त निर्भरता opencv_nonfree249d.lib जोड़ें। उन लोगों के साथ ओसीवी दस्तावेज से निम्नलिखित उदाहरण ठीक काम करता है :-) http://docs.opencv.org/doc/tutorials/features2d/feature_detection/feature_detection.html#feature-detection

संबंधित मुद्दे