OpenCv 2.4.3:找不到imread和SurfFeatureDetector :: detect

时间:2013-02-18 15:51:12

标签: c++ xcode opencv osx-snow-leopard

在Mac OSX 10.8上,XCode 4.6,在C ++中

我正在关注系统中位于opencv_tutorials.pdf的{​​{1}}中的教程。在页311,我们得到此示例(略有编辑):

/opt/local/share/OpenCV/doc

我必须将上面的代码修改为#include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" using namespace cv; int main( int argc, char** argv ) { Mat img_1 = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE ); int minHessian = 400; SurfFeatureDetector detector( minHessian ); std::vector<KeyPoint> keypoints_1; detector.detect( img_1, keypoints_1 ); } ,这是我通过运行

找到的文件
#include "opencv2/nonFree/features2d.hpp"

代码编译,意味着在find /opt/local/include -name "*.hpp" -exec grep SurfFeatureDetector "{}" ';' -print 文件中找到符号detector.detect,并通过C ++编译器进行类型检查。接下来是尝试查找包含符号的库。

现在,我在我的发行版中有这些库,hpp

/opt/local/lib

我发现libopencv_calib3d.2.4.3.dylib libopencv_contrib.2.4.3.dylib libopencv_core.2.4.3.dylib libopencv_features2d.2.4.3.dylib libopencv_flann.2.4.3.dylib libopencv_gpu.2.4.3.dylib libopencv_highgui.2.4.3.dylib libopencv_imgproc.2.4.3.dylib libopencv_legacy.2.4.3.dylib libopencv_ml.2.4.3.dylib libopencv_nonfree.2.4.3.dylib libopencv_objdetect.2.4.3.dylib libopencv_photo.2.4.3.dylib libopencv_stitching.2.4.3.dylib libopencv_ts.2.4.3.dylib libopencv_video.2.4.3.dylib libopencv_videostab.2.4.3.dylib 搜索这些所需的符号没有信息,因为名称修改很难在我脑中反编译。我只是暴力包含所有库,但仍然会出现链接器错误:

nm

我已经从这里开始对OpenCv参考文档和维基页面进行了一些现场检查

Undefined symbols for architecture x86_64:
  "cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
      _main in main.o
  "cv::FeatureDetector::detect(cv::Mat const&, std::__1::vector<cv::KeyPoint, std::__1::allocator<cv::KeyPoint> >&, cv::Mat const&) const", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64

但没有成功。

我很感激

  1. 查找这些OpenCv API的具体帮助
  2. 此类查询的一般策略:“哪个库包含我需要链接的符号”。这种问题让我讨厌C ++,因为5分钟的编码似乎总会导致数小时的搜索,这可能是因为我不知道这样做的专业秘密。

3 个答案:

答案 0 :(得分:8)

在Linux上并使用 OpenCV 3.0.0 ,我必须与opencv_imgcodecs共享库链接。

答案 1 :(得分:2)

我的工具链利用CMake来跟踪这些事情。对于我使用的大多数新库,通常有google可搜索的Find * .cmake文件,这些文件是由其他人编写的。如果您想了解有关我的具体设置的更多信息,请随时提出。我已经在非自由库中看到了这个特定问题(架构x86_64的未定义符号)几次。不过,我不知道为什么你会为imread得到错误。我要看的第一个地方是samples / cpp文件夹中的matcher_simple.cpp示例。如果您可以编译并运行它(使用this)和其他示例,那么您的设置应该没问题。如果你不能,请你发布那个例子的错误吗?我不熟悉XCode,但someone else建议转到Build Settings&gt; Build Options&gt;编译器用于C / C ++ / Objective-C并将其从Apple LLVM编译器更改为LLVM GCC 4.2。还有一些其他的猜测here

答案 2 :(得分:0)

尝试在构建设置中的其他链接器标记列表中包含-lopencv_features2d-lopencv_nonfree。我遇到了同样的问题而且它对我有用