2012-04-01 31 views
17

Tôi đang tạo một chương trình bằng C++ sử dụng 2 hình ảnh để phát hiện SURF Features, tính toán các kết quả phù hợp với bruteforcematcher và vẽ nó.OpenCV - tham chiếu không xác định: SurfFeatureDetector và BruteForceMatcher

Dưới đây là đoạn 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; 
} 

xây dựng không phải là một vấn đề, nhưng khi liên kết, tôi có được điều này lỗi rất khó chịu:

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 

Tôi thực sự không biết vấn đề là gì. Tôi không tìm thấy thứ gì trên Internet. Hy vọng ai đó có thể giúp đỡ!

Chỉnh sửa: Đây là CMakeLists.txt tôi:

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

Tôi gặp vấn đề tương tự, bạn đã bao gồm opencv_features2d như thế nào? Tôi đã làm SET (OpenCV_LIBRARIES opencv_core opencv_highgui opencv_imgproc opencv_features2d) nhưng nó không hoạt động. – rajat

Trả lời

41

Nếu bạn đang sử dụng giao diện opencv 2.4, SURF và SIFT được thay đổi thành thư mục không miễn phí. Bạn có thể sử dụng nó bằng cách bao gồm dòng này

#include <opencv2/nonfree/features2d.hpp> 

sau đó bạn có thể sử dụng SurfFeatureDetector như trước đây.

+2

Thêm cũng làm thư viện động để liên kết libopencv_nonfree.so và libopencv_features2d.so –

0

Tôi thực sự không biết vấn đề là gì.

Sự cố có nhiều khả năng là đường liên kết không chính xác. Thật không may, bạn không nói dòng liên kết của bạn là gì , vì vậy bạn không thể trợ giúp thêm. Đọc this có thể hữu ích.

+0

Lời xin lỗi của tôi, tôi quên điều đó.Chỉnh sửa bài đăng đầu tiên. –

+1

Tìm thấy nó: Tôi quên bao gồm một thư viện (opencv_features2d). –

8

Đối với SURF, @Mingyi Wu đã trả lời. Đối với BruteForceMatcher, xin vui lòng

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

Tôi có vấn đề này sau khi OpenCV nâng cấp từ 2.3.1 đến 2.4.5, và tôi đã giải quyết vấn đề này liên kết opencv_nonfree, và thêm các tiêu đề cần thiết cho dự án của tôi:

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

Làm thế nào để bạn liên kết opencv_nonfree ?? –

0

Tôi gặp sự cố tương tự sau khi cài đặt ROS. Vấn đề là tôi đã liên kết với các thư viện sai.

Tôi cố định các lỗi liên kết bằng cách thêm dòng sau vào CMakeLists.txt tôi: link_directories(/opt/ros/groovy/lib)

Các vấn đề liên quan