C++ OpenCV - 未定义的参考:SurfFeatureDetector 和 BruteForceMatcher
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9968993/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
OpenCV - undefined reference: SurfFeatureDetector and BruteForceMatcher
提问by Lennart-
I'm making a program in C++ that uses 2 images to detect SURF Features, compute the matches with a bruteforcematcher and draws it.
我正在用 C++ 编写一个程序,它使用 2 个图像来检测 SURF 特征,使用 bruteforcematcher 计算匹配并绘制它。
Here's the 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;
}
Building isn't a problem, but when linking, I get this very nasty errors:
构建不是问题,但是在链接时,我遇到了这个非常讨厌的错误:
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
I really don't know what the problem is. I didn't find a thing at the Internet. Hope someone can help!
我真的不知道是什么问题。我在互联网上没有找到任何东西。希望有人能帮忙!
Edit: This is my CMakeLists.txt:
编辑:这是我的 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)
回答by Mingyi Wu
If you're using opencv 2.4, SURF and SIFT interfaces are changed to nonfree folder. You can use it by including this line
如果您使用的是 opencv 2.4,则 SURF 和 SIFT 接口将更改为非自由文件夹。您可以通过包含此行来使用它
#include <opencv2/nonfree/features2d.hpp>
then you can use SurfFeatureDetector as before.
那么您可以像以前一样使用 SurfFeatureDetector。
回答by Yantao Xie
For SURF, @Mingyi Wu have answered. For BruteForceMatcher, please
对于 SURF,@Mingyi Wu 已经回答了。对于BruteForceMatcher,请
#include <opencv2/legacy/legacy.hpp>
回答by Bos
if you're using opencv2.4 or trunk from svn, SURF and SIFT interfaces are changed. http://code.opencv.org/projects/opencv/wiki/ChangeLog
如果您使用的是来自 svn 的 opencv2.4 或主干,则 SURF 和 SIFT 接口已更改。 http://code.opencv.org/projects/opencv/wiki/ChangeLog
回答by Seanny123
I had a similar problem after installing ROS. The problem was that I was linking to the wrong libraries.
安装ROS后我遇到了类似的问题。问题是我链接到了错误的库。
I fixed the link errors by adding the following line to my CMakeLists.txt: link_directories(/opt/ros/groovy/lib)
我通过将以下行添加到我的 CMakeLists.txt 来修复链接错误: link_directories(/opt/ros/groovy/lib)
回答by userutf8
for ocv 2.4.9:#include <opencv2/nonfree/features2d.hpp>
is the location of SURF. In project Settingsselect Configuration Properties, then Linker, then Inputand then add opencv_nonfree249d.libto Additional Dependencies. With those ones the following example from ocv documentation works fine :-) http://docs.opencv.org/doc/tutorials/features2d/feature_detection/feature_detection.html#feature-detection
对于 ocv 2.4.9:#include <opencv2/nonfree/features2d.hpp>
是 SURF 的位置。在项目设置中选择配置属性,然后链接器,然后输入,然后将opencv_nonfree249d.lib添加到附加依赖项。对于那些来自 ocv 文档的以下示例工作正常:-) http://docs.opencv.org/doc/tutorials/features2d/feature_detection/feature_detection.html#feature-detection
回答by Employed Russian
回答by user2452014
I had this problem after upgrade OpenCV from 2.3.1 to 2.4.5, and I've solved this issue linking opencv_nonfree, and add the necessary headers for my project:
将 OpenCV 从 2.3.1 升级到 2.4.5 后,我遇到了这个问题,我已经解决了链接 opencv_nonfree 的这个问题,并为我的项目添加了必要的头文件:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/imgproc/imgproc.hpp"