c++ - OpenCV - 未定义的引用 : SurfFeatureDetector and BruteForceMatcher

标签 c++ opencv linker undefined-reference surf

我正在用 C++ 编写一个程序,它使用 2 张图像来检测 SURF 特征,使用 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

我真的不知道问题是什么。我在互联网上没有找到任何东西。希望有人能帮忙!

编辑:这是我的 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)

最佳答案

如果您使用的是 opencv 2.4,SURF 和 SIFT 接口(interface)将更改为 nonfree 文件夹。您可以通过包含此行来使用它

#include <opencv2/nonfree/features2d.hpp>

那么您可以像以前一样使用 SurfFeatureDetector。

关于c++ - OpenCV - 未定义的引用 : SurfFeatureDetector and BruteForceMatcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9968993/

相关文章:

c++ - 使用 SFML 时 undefined reference

c - DMD:链接到 libc.a?或者 core.simd 信息?

c++ - 现代 UnitTest++ 替代品

c++ - 如何修复错误 "GLib-GIO-ERROR**: No GSettings schemas are installed on the system"?

c++ - 如果传入 std::swap 的对象在交换期间抛出异常怎么办?

java - 如何在Java包装器中使用Opencv的分区功能

c++ - 使用opencv逐个单元读取表格(图像)的数据

objective-c - 由于 ios 和 iphonesimulator 的库不同而导致链接错误?

c++ - 两个字符串的递归比较

c++ - 有没有办法在右值和左值引用中创建函数时避免重复代码?