1

在 Mac OSX 10.8、XCode 4.6 上,使用 C++

我正在关注opencv_tutorials.pdf位于/opt/local/share/OpenCV/doc我的系统中的教程。在第 311 页,我们得到了这个示例(稍作编辑):

#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在文件中找到符号hpp并通过 C++ 编译器的类型检查。接下来是尝试查找包含符号的库。

现在,我的发行版中有这些库,位于/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这些符号中搜索所需的符号并没有提供任何信息,因为在我的脑海中很难对名称进行反编译。我只是蛮力包含了所有库,但仍然出现链接器错误:

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

从这里开始,我对 OpenCv 参考文档和 wiki 页面进行了一些抽查

http://opencv.willowgarage.com/documentation/cpp/features2d__feature_detection_and_descriptor_extraction.html

但没有成功。

我将不胜感激

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

3 回答 3

8

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

于 2015-03-21T16:23:59.707 回答
2

我的工具链利用 CMake 来跟踪这些事情。对于我使用的大多数新库,通常都有谷歌可搜索的随附 Find*.cmake 文件,这些文件是由其他人编写的。如果您想了解有关我的特定设置的更多信息,请随时询问。对于非自由库中的东西,我已经多次看到这个特定问题(架构 x86_64 的未定义符号)。不过,我不确定您为什么会收到 imread 的错误。我首先要看的是 samples/cpp 文件夹中的 matcher_simple.cpp 示例。如果您可以编译并运行它(使用this)和其他示例,那么您的设置应该没问题。如果你不能,你能把那个例子的错误贴出来吗?我不熟悉 XCode 但其他人建议转到 Build Settings>Build Options> Compiler for C/C++/Objective-C 并将其从 Apple LLVM Compiler 更改为 LLVM GCC 4.2。这里也有一些其他的猜测。

于 2013-02-18T17:29:43.387 回答
0

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

于 2013-12-17T03:37:40.387 回答